当2个xsd文件中有2个XmlRootElements时,Marshal / unmarshal

时间:2014-07-08 22:36:26

标签: java xml jaxb xsd

有些东西告诉我,我正在通过JAXB用xsd到类生成执行Java恐怖秀......希望有人可以告诉我什么!

我已经获得了几个相关的XSD,我需要能够与API进行交互。让我们说有A.xsd和B.xsd。 A.xsd定义了一个body元素,它基本上可以包含任何类型的列表,包括B对象:

<xsd:element name="Body" minOccurs="0">
<xsd:complexType>
<xsd:sequence>
<xsd:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:anyAttribute namespace="##any"/>
</xsd:complexType>
</xsd:element>

所以我为A.xsd生成了类,其根元素标记如下:

@XmlRootElement(name = "A", namespace = "http://www.example.com/a")
public class A {

我在同一个包中创建package-info.java以拥有该命名空间,以便我可以编组它:

@XmlSchema(namespace = "http://www.example.com/a", elementFormDefault = XmlNsForm.QUALIFIED)
package com.mypackage;

现在我将B.xsd的类生成到相同的包中。 (我将A的ObjectFactory重命名为其他东西,因为IntelliJ没有附加工厂。)

编辑:我还在不同的软件包中创建了它们,但之后我遇到了编组问题,因为请求xml需要A和B.)

(子问题 - 你通常会这样做吗?)

所以B班现在有:

@XmlRootElement(name = "B")
public class B {

有了这个,我现在可以创建一个A,然后编组它。由于package-info.java(la Java: Marshalling Object -- Removing extra ns2 annotation in xml),当我将B嵌入体内时,我不会感到讨厌的ns2。

我从API获得的响应消息也给了我一个A,我可以在没有问题的情况下解组。 但是 Body中的底层对象(应该是B)不会被解组 - 它是一个Node对象,所以我试过了:

JAXBContext specialContext = JAXBContext.newInstance(B.class);
Object companyAppt = specialContext.createUnmarshaller().unmarshal((Node)reply.getBody().getAny().get(0));

但我得到了这个例外:

javax.xml.bind.UnmarshalException: unexpected element (uri:"/some/uri/location", local:"B"). Expected elements are <{http://www.example.com/a}B>

因此,我认为答案在于package-info.java,但我只是不知道如何操纵它。

提前致谢。

修改

这是我正在使用的xsd:

我的例子中的“A”= http://xmlgw.companieshouse.gov.uk/v1-0/schema/Egov_ch-v2-0.xsd

我的exmaple中的

“B”= http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd

其他相关xds:http://xmlgw.companieshouse.gov.uk/v1-0/schema/chbase-v2-1.xsd

1 个答案:

答案 0 :(得分:0)

为什么不使用xjc创建Jaxb类,如果存在冲突,可以传递多个xsds并使用绑定文件。

xjc -d out A.xsd B.xsd