JAXB for XMLs具有类似的结构

时间:2014-08-07 16:10:24

标签: java xml jaxb

我们正在使用JAXb来解析没有架构的XML ...

我们处理的XML之一如下:

<Trade>
    <Something1>
         <!-- stuff here -->
    </Something1>
</Trade>

而另一个是这样的:

<Trade>
    <Something2>
         <!-- stuff here -->
    </Something2>
</Trade>

我们使用相同的Jaxb上下文和unmarshaller将它们解析为对象,比如说Something1Something2Something1Something2都实现了一个名为{{1}的接口解组的结果被强制转换为Something。当然,这两个对象都是上下文已知的。但是,根据unmarshaller首先找到的类,这两个XML最终都会被解组为SomethingSomething1个对象。

我还尝试添加了一些XML-&gt; XSD生成的模式,但这是一个死胡同,因为这是Something2和其他几个标签的冲突。我得到的错误就像:

<Trade>

是否无法使用JAXB统一处理两个类似结构的XML?

提前致谢。

1 个答案:

答案 0 :(得分:0)

您可以像这样编写元素贸易类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "TradeType", propOrder = {
    "something1",
    "something2"
})
public class TradeType {
    @XmlElement(name = "Something1")
    protected Something1Type something1;
    @XmlElement(name = "Something2")
    protected Something2Type something2;
    // getters, setters
}

BTW,这是您编译(xjc)此XML架构时所获得的:

<xs:complexType name="TradeType">
  <xs:choice>
    <xs:element name="Something1" type="Something1Type"/>
    <xs:element name="Something2" type="Something2Type"/>
  </xs:choice>
</xs:complexType>

您只需要一个顶级元素Trade,并且可以通过将trade.getSomethingX()与null进行比较来区分(在解组之后)。

如果Something1Type和Something2Type类型相同(不是“相似”),则可以使用相同的(不是接口)。