有些东西告诉我,我正在通过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
答案 0 :(得分:0)
为什么不使用xjc创建Jaxb类,如果存在冲突,可以传递多个xsds并使用绑定文件。
xjc -d out A.xsd B.xsd