2012-12-07 72 views
1

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

如何创建一组不重复顶层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是其他的东西数量。它几乎就像一个需要反向XmlSeeAlso

任何想法,如何如何做到这一点?

+0

只需在此添加更多。我最初的问题是希望为每个特定的实现保留一个带有子类的单个JAXB注释类。 – Streamweaver

+0

它不'感觉非常干燥,但现在我通过保持EveApiConfig超类并为每个特定实现创建子类来实现此目的。仍然希望在我的JAXB noobness中丢失一个更优雅的方法。 – Streamweaver

回答

1

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

  • result@XmlElementRef,与输入的东西像JAXBElement<AbstractResultConfig>
  • 每箱有ObjectFactory
  • 其中ObjectFactory类实现不同@XmlElementDecl工厂创建一个包方法,该方法将创建具有AbstractResultConfig的不同子类的实例的JAXBElement。喜欢的东西:

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

我想你需要配对第i个与​​法或类似这样的东西。