我目前正致力于编组/解组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设置名称空间,则会出现上述错误。 如果我设置它,我有相同的错误,但名称属性。
答案 0 :(得分:1)
您可以删除@XmlElement
的{{1}}注释。只要它有一个公共getter,默认行为也是编组它。
XML应该是这样的。
ElementXX
另一种方法是使用类似于RootElementA和B的<ns3:rootElementB xmlns:ns2="http://namespaceA" xmlns:ns3="http://namespaceB">
<elementXX/>
</ns3:rootElementB>
在其java类中声明ElementXX
的命名空间。然后在RootElementA和B中用@XmlRootElement
替换@XmlElement
。
XML将如下所示:(注意:我添加了测试的字段名称)
@XmlElementRef
我无法完全重现您的错误。但是,我认为,至少可以说,在两个名称空间中声明<ns4:rootElementB xmlns:ns2="http://namespaceXX" xmlns:ns3="http://namespaceA" xmlns:ns4="http://namespaceB">
<ns2:elementXX>
<name>test</name>
</ns2:elementXX>
</ns4:rootElementB>
是不可取的。如果您可以修改您的模式,我建议创建一个具有自己的命名空间并在其中声明ElementXX
的新模式。然后修改其他两个以引用其元素。
答案 1 :(得分:0)
你这里没有xml看看..但我想下面的链接会给你一个答案。
XML unmarshalling using Jaxb with namespaces and schema
如果没有发布你试图解组的xml。
答案 2 :(得分:0)
您可以使用@XmlSchema
批注指定包中类和属性的命名空间限定。您可以通过在@XmlType
上指定命名空间来为类的属性指定命名空间。然后,您可以使用@XmlRootElement
,@XmlElement
和@XmlAttribute
为单个元素/属性指定命名空间。
了解更多信息