2

I'm currently working on marshalling/unmarshalling XML messages. Here are my two XML elements :

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

    @XmlElement
    private ElementXX elementXX;

}

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

    @XmlElement
    private ElementXX elementXX;

}

When unmarshalling a RootElementB I have the following error :

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://namespaceB", local:"ElementXX"). Expected elements are <{}ElementXX>

If I add the namespace to the ElementXX declaration, I have the same error except that it occurs for properties of ElementXX.

The problem is that I can't set the namespace on properties of ElementXX because it is specified in both namespaces and I don't want to duplicate my class just to change the namespace...

Do you have an idea ? Thanks.

EDIT

Here is a XML sample :

<RootElementA xmlns="http://namespaceA">
    <ElementXX>
        <name>blabla</name>
        <desc>blabla</desc>
    </ElementXX>
</RootElementA>

If I don't set a namespace to ElementXX in XmlRootElementA class I have the error above. If I set it, I have the same error but for the name property.

4

3 回答 3

1

您可以删除 的@XmlElement注释ElementXX。只要它有一个公共 getter,默认行为也是对它进行编组。

XML 应如下所示。

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

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

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在其中声明。然后修改其他两个以引用其元素。

于 2013-09-03T11:06:31.190 回答
0

You can use the @XmlSchema annotation to specify the namespace qualification for classes and properties within a package. You can specify the namespace for the properties of a class by specifying the namespace on @XmlType. Then you can specify the namespace for a so single element/attribute using @XmlRootElement, @XmlElement, and @XmlAttribute.

For More Information

于 2013-09-03T11:32:51.060 回答
0

你没有xml在这里看看..但我想下面的链接会给你一个答案。

使用带有命名空间和模式的 Jaxb 进行 XML 解组

如果不发布您尝试解组的 xml。

于 2013-09-03T10:42:06.210 回答