gpt4 book ai didi

java - 我可以使用 JAXB 将所有 namespace 定义放入顶级元素吗

转载 作者:行者123 更新时间:2023-11-30 11:53:45 26 4
gpt4 key购买 nike

使用手工代码我的 xml 是这样的:

    <?xml version="1.0" encoding="UTF-8"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#"
xmlns:ext="http://musicbrainz.org/ns/ext-1.0#">
<artist-list offset="0" count="8">
<artist type="Person" id="00ed154e-8679-42f0-8f42-e59bd7e185af"
ext:score="100">

现在使用更好的 JAXB 但是尽管 xml 完全有效我需要强制它把 xmlns:ext="http://musicbrainz.org/ns/ext#-1.0"放在元数据元素中而不是与我无法控制的客户端代码兼容的艺术家元素。

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<metadata xmlns="http://musicbrainz.org/ns/mmd-1.0#">
<artist-list offset="0" count="4">
<artist type="Person" id="00ed154e-8679-42f0-8f42-e59bd7e185af"
ext:score="100" xmlns:ext="http://musicbrainz.org/ns/ext#-1.0">

请问这个可以吗?

编辑:用 String replace 解决它,因为我只需要处理一个特定的案例

    String xml = sw.toString();

//Remove extension namespace definition
xml=xml.replace("xmlns:ext=\"http://musicbrainz.org/ns/ext#-1.0","");

//Add it to the top instead
xml=xml.replace("<metadata xmlns=\"http://musicbrainz.org/ns/mmd-1.0#\">",
"<metadata xmlns=\"http://musicbrainz.org/ns/mmd-1.0#\" xmlns:ext=\"http://musicbrainz.org/ns/ext-1.0#\">");

//Now write out to the proper output stream
out.write(xml);

最佳答案

我认为没有办法使用 JAXB 来完成它,但这里有一个使用 Dom4J 的快速后处理器:

public static void moveNameSpacesToRoot(Document document) {
final Element rootElement = document.getRootElement();
moveNameSpacesToRootElement(rootElement, rootElement);
}

@SuppressWarnings("unchecked")
private static void moveNameSpacesToRootElement(
Element thisElement, Element rootElement) {
if (!thisElement.equals(rootElement)) {
Namespace namespace = thisElement.getNamespace();
if (!namespace.equals(Namespace.NO_NAMESPACE)) {
Namespace existingRootNamespace =
rootElement.getNamespaceForPrefix(namespace.getPrefix());
if (existingRootNamespace == null) {
rootElement.add(namespace);
}
thisElement.remove(namespace);
}
}
for (Element child : (List<Element>) thisElement.elements()) {
moveNameSpacesToRootElement(child, rootElement);
}
}

哦,我刚刚意识到您需要属性,而不是元素。但是,更改是微不足道的,所以我会把它留给你。

关于java - 我可以使用 JAXB 将所有 namespace 定义放入顶级元素吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6108109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com