JAXB使用默认命名空间

时间:2013-09-03 08:10:57

标签: xml namespaces jaxb unmarshalling

我目前正致力于编组/解组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设置名称空间,则会出现上述错误。 如果我设置它,我有相同的错误,但名称属性。

3 个答案:

答案 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为单个元素/属性指定命名空间。

了解更多信息