java - 使用 JAXB 解码具有不同/动态名称的元素

标签 java xml serialization orm jaxb

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

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

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

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

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"> 之外,如何处理这种情况的任何想法元素?

最佳答案

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

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

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

如果您必须使用 JAXB,那就是这样。您可能会发现直接对此类数据使用 SAX 或 DOM API 会更容易。 JAXB 真正适用于可以表示为模式的定义明确的数据。

关于java - 使用 JAXB 解码具有不同/动态名称的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/835075/

相关文章:

java.util.concurrent.ExecutionException : java. lang.OutOfMemoryError: Java 堆空间

java - Gradle 编译项目因 Spring Boot 插件失败

java - 在 Java 中解码为数组或 arrayList

java - 根据设备的大小调整 Android 中的表单大小

java - 服务端和客户端必须有相反的声明 ObjectOutputStream 和 ObjectInputStream 的顺序吗?

java - 找不到类 java.util.logging.ErrorManager 的序列化程序,也没有发现用于创建 BeanSerializer 的属性

java - SerializationProxy 模式给出 ClassCastException : How to avoid?

java - Spring Data,获取行ManyToOne/OneToMany关系?

javascript - 如何使用 Angular http 发布 XML?

.net - JSON.NET 序列化问题