java - 当 2 个 xsd 文件中有 2 个 XmlRootElement 时,编码/解码

标签 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以拥有该 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/

相关文章:

java - 在哪里存储 Java-Servlets 常量

java - SpringBoot 使用 Jackson 在 Java 中反序列化 JSON 数组

python - 向 xml 文档添加注释

android - 如何使图像完整作为背景图像?

java - JAXB 类的惰性处理

java - 向客户端返回 Web 服务响应?

java - 日期格式失败

java - IndexOutOfBounds 使用 Javas imageio.write() 创建 png 格式的字节数组

html - 如何使用 XSLT 以 HTML 格式显示图像?

maven-jaxb2-plugin 失败,必须存在 JAXB 版本属性