gpt4 book ai didi

jaxb - 如何使用 JAXB 处理来自两个不同模式的消息(具有相同的根元素名称)

转载 作者:行者123 更新时间:2023-12-04 22:43:21 25 4
gpt4 key购买 nike

我们有一个客户端正在发送由两个独立模式生成的 xml 消息。

我们希望在单个应用程序中处理它们,因为内容是相关的。

我们不能修改他们用来生成 XML 消息的客户端模式...

我们可以修改我们自己的两个模式(或 binding.jxb)的副本——如果有帮助的话——以启用我们的 JAXB 处理从两个单独模式创建的消息。

不幸的是,这两个模式具有相同的根元素名称(见下文)。

问题:JAXB 是否绝对禁止处理具有相同根元素名称的两个模式?
- 如果是这样,我将停止我的“复活节彩蛋”寻找解决方案......--- 或者,是否有一些变通方法可以让我们使用 JAXB 来处理从两个不同模式生成的这些 XML 消息?

schema1(注意根元素名称:“A”):

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="A">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="AA">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="AAA1" type="xsd:string" />
<xsd:element name="AAA2" type="xsd:string" />
<xsd:element name="AAA3" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="BB">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="BBB1" type="xsd:string" />
<xsd:element name="BBB2" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

schema2(再次注意,使用相同的根元素名称:“A”)

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:element name="A">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="CCC">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="DDD1" type="xsd:string" />
<xsd:element name="DDD2" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="EEE">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="EEE1">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="FFF1" type="xsd:string" />
<xsd:element name="FFF2" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="EEE2" type="xsd:string" />
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

最佳答案

QUESTION: Does JAXB prohibit absolutely the processing two schemas that have the same root element name?

回答:您可以将多个类映射到同一个根元素,但您需要在解码操作中指定类型。

A1

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="A")
public class A1 {
}

A2

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="A")
public class A2 {
}

输入.xml

<A/>

演示

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import javax.xml.transform.stream.StreamSource;

public class Demo {

public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(A1.class, A2.class);

Unmarshaller unmarshaller = jc.createUnmarshaller();
File xmlFile = new File("input.xml");
StreamSource xmlSource = new StreamSource(xmlFile);
A1 a1 = unmarshaller.unmarshal(xmlSource, A1.class).getValue();

Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(a1, System.out);
}
}

更多信息:


以下是一个示例绑定(bind)文件,可用于自定义元素映射到的类。我看不到这两个模式之间的任何关系。您是否以某种方式将它们组合为单个 XJC 操作?

<jxb:bindings 
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">

<jxb:bindings schemaLocation="schema1.xsd">
<jxb:bindings node="//xs:element[@name='A']">
<jxb:class name="RenamedA"/>
</jxb:bindings>
</jxb:bindings>
</jxb:bindings>

关于jaxb - 如何使用 JAXB 处理来自两个不同模式的消息(具有相同的根元素名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5249888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com