有件事告诉我,我正在通过 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
以拥有该 namespace ,以便我可以对其进行编码:
@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 并对其进行编码(marshal)。当我将 B 嵌入到主体中时,由于 package-info.java
(a la Java: Marshalling Object -- Removing extra ns2 annotation in xml ),我不会得到令人讨厌的 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
我的例子中的“B” = http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd
其他依赖 xd:http://xmlgw.companieshouse.gov.uk/v1-0/schema/chbase-v2-1.xsd
最佳答案
为什么不使用 xjc 创建 Jaxb 类,在其中可以传递多个 xsd 并在存在冲突时使用绑定(bind)文件。
xjc -d 输出 A.xsd B.xsd
关于java - 当 2 个 xsd 文件中有 2 个 XmlRootElement 时,编码/解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24642590/