1

我有不同的 XML 返回,我想用带有注释类的 JAXB 进行解析。许多 XML 文件共享相似的顶层结构,并且内部标记的内容可能会有所不同。由于我们向 ContextInstance 发送了一个类而不是一个实例,因此我无法添加类。

给定这样的两个文件的示例,您将如何创建一组不会每次都重复顶级 xml 的 JAXB 注释。

<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
  <currentTime>2008-11-24 20:14:29</currentTime>
  <result>
    <serverOpen>True</serverOpen>
    <onlinePlayers>38102</onlinePlayers>
  </result>
  <cachedUntil>2008-11-24 20:17:29</cachedUntil>
</eveapi>

还有一个像这样的文件:

<?xml version='1.0' encoding='UTF-8'?>
<eveapi version="2">
  <currentTime>2012-02-12 14:39:12</currentTime>
  <result>
    <rowset name="characters" key="characterID"     columns="name,characterID,corporationName,corporationID">
      <row name="Alexis Prey" characterID="1365215823" corporationName="Puppies To the     Rescue" corporationID="238510404"/>
    </rowset>
  </result>
  <cachedUntil>2012-02-12 15:27:00</cachedUntil>
</eveapi>

一个常见的顶级课程就像

@XmlRootElement(name="eveapi")
public class EveApiConfig {
    @XmlElement(required = true)
    protected Date currentTime;

    @XmlElement(required = true)
    protected String cachedUntil;

    @XmlAttribute(name = "version", required = true)
    protected int version;

    @XmlElement(required = true)
    protected ResultsConfig result;
}

但是 ResultsConfig 将是其他一些东西。这几乎就像需要一个反向 X​​mlSeeAlso

如果如何做到这一点有什么想法吗?

4

1 回答 1

1

我认为你可以通过几个对象工厂来实现这一点。我将勾勒出解决方案:

  • result一个@XmlElementRef, 用类似的东西输入JAXBElement<AbstractResultConfig>
  • 每个案例创建一个带有ObjectFactory
  • 哪些ObjectFactory类实现了不同的@XmlElementDecl工厂方法,该方法将创建JAXBElements 的不同子类的实例AbstractResultConfig。就像是:

    @XmlElementDecl(name = "Result")
    public JAXBElement<ResultConfigImpl> createResultConfigImpl(ResultConfigImpl value) {
        return new JAXBElement<ResultConfigImpl>(..., ResultConfigImpl.class, null, value);
    }
    

我想你需要将它与createResultConfig()方法或类似的东西配对。

于 2013-02-02T20:19:37.757 回答