gpt4 book ai didi

xml - JAXB 使用默认命名空间

转载 作者:行者123 更新时间:2023-12-04 16:51:56 25 4
gpt4 key购买 nike

我目前正在编码/解码 XML 消息。这是我的两个 XML 元素:

@XmlRootElement(namespace = "http://namespaceA")
public class RootElementA {

@XmlElement
private ElementXX elementXX;

}

@XmlRootElement(namespace = "http://namespaceB")
public class RootElementB {

@XmlElement
private ElementXX elementXX;

}

解码 RootElementB 时出现以下错误:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://namespaceB", local:"ElementXX"). Expected elements are <{}ElementXX>

如果我将命名空间添加到 ElementXX 声明中,我会遇到相同的错误,只是它发生在 ElementXX 的属性上。

问题是我无法在 ElementXX 的属性上设置命名空间,因为它在两个命名空间中都指定了,而且我不想复制我的类只是为了更改命名空间...

你有想法吗 ?
谢谢。

编辑

这是一个 XML 示例:
<RootElementA xmlns="http://namespaceA">
<ElementXX>
<name>blabla</name>
<desc>blabla</desc>
</ElementXX>
</RootElementA>

如果我没有在 XmlRootElementA 类中为 ElementXX 设置命名空间,则会出现上述错误。
如果我设置它,我有同样的错误,但对于 name 属性。

最佳答案

您可以删除 @XmlElement ElementXX 的注释.只要它有一个公共(public) getter,默认行为也是编码(marshal)它。

XML 应该如下所示。

<ns3:rootElementB xmlns:ns2="http://namespaceA" xmlns:ns3="http://namespaceB">
<elementXX/>
</ns3:rootElementB>

另一种方法是声明 ElementXX 的命名空间。在其 java 类中使用 @XmlRootElement类似于 RootElementA 和 B。然后替换 @XmlElement@XmlElementRef在 RootElementA 和 B 中。

然后 XML 将如下所示:( 注意 :我为测试添加了字段名称)

<ns4:rootElementB xmlns:ns2="http://namespaceXX" xmlns:ns3="http://namespaceA" xmlns:ns4="http://namespaceB">
<ns2:elementXX>
<name>test</name>
</ns2:elementXX>
</ns4:rootElementB>

我无法完全重现您的错误。然而,我认为,有 ElementXX至少可以说,在两个命名空间中声明是不可取的。如果您可以修改您的架构,我建议创建一个具有自己命名空间的新架构并声明 ElementXX在里面。然后修改其他两个以引用其元素。

关于xml - JAXB 使用默认命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18587180/

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