7

我正在解析具有如下节点的 XML 文档:

<objects>
  <dog>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </dog>
  <cat>
    <data1>...</data1>
    <data2>...</data2>
    <data3>...</data3>
  </cat>
</objects>

元素 data1、data2、data3 始终是一致的。只有父标签不同。在我的对象模型中,我有一个代表所有这些情况的对象。在事先不知道元素名称的情况下,如何让 JAXB 处理这种情况?

@XMLAnyElement 匹配所有对象,但不创建适当类型的对象;我得到一个节点对象列表而不是我的对象。我的对象目前看起来像:

public class MyObject {
    protected String otherData;

    @XmlAnyElement
    @XmlElementWrapper(name = "objects")
    protected List<MyChildObject> childObjects;
}

public class MyChildObject {
    protected String data1;
    protected String data2;
    protected String data3;
}

除了将传入的 XML 格式更改为使用<object type="dog">元素之外,如何处理这种情况的任何想法?

4

2 回答 2

7

如果名称是真正动态的,那么我认为 JAXB 不会帮助您。如果您有定义数量的各种元素名称,那么您可以像其他帖子建议的那样使用继承。如果元素和名称的数量未知,我建议使用如下内容:

@XmlMixed
@XmlAnyElement
public List<Object> getObjects() {
    return objects;
}

这会带来元素只是一个 DOM 元素。然后,您可以再次使用 JAXB 将每个元素转换为您的自定义类型。

那将是如果您必须使用 JAXB。您可能会发现直接使用 SAX 或 DOM API 来处理此类数据更容易。JAXB 真正适用于可以表示为模式的定义良好的数据。

于 2009-05-07T15:43:00.873 回答
0

您可以使用继承:

@XmlRootElement(name = "dog")
public class MyDogObject extends MyChildObject {
    //nothing here
}

@XmlRootElement(name = "cat")
public class MyCatObject extends MyChildObject {
    //nothing here
}

通过这种方式,您可以处理相同的对象类型,MyChildObject同时灵活地控制 XML 结构。另一个好处是,如果您将来定义特定的狗/猫 XML 节点 - 它们可以映射到相应的子类,但不能映射到另一个,正如预期的那样。

于 2009-05-07T15:06:16.233 回答