【问题标题】:Mapping a generic, nested XML data structure with JAXB使用 JAXB 映射通用的嵌套 XML 数据结构
【发布时间】:2017-08-16 07:39:49
【问题描述】:

我正在尝试将以下嵌套结构映射到列表。问题是<list> 可以嵌套。因此,例如,顶级列表可以包含一个或多个其他列表,这些列表又包含一些元素,例如我的示例中的 <property>

<operator name="A2">
    <list name="table">
        <list>
            <property name="A1" value="1" dataType="boolean"/>
            <property name="b" value="1" dataType="boolean"/>
        </list>
    </list>
</operator>

&lt;list&gt; 也可以直接包含&lt;property&gt; 元素而无需进一步嵌套:

<operator name="A3">
    <list name="xyz">
        <property name="x" value="1.9" dataType="double"/>
        <property name="y" value="0.2" dataType="double"/>
    </list>
</operator>

我试着像这样映射它:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "list")
public class List<T> {

    @XmlAttribute(name="name")
    public String name;

    @XmlAnyElement
    public T topLevelList;

    public List() {}
}

但是,只有外部列表被映射。这是第一个 XML 块的打印 toString 调用中的相关部分:

Operator{list=List{name='table', topLevelList=[list: null]}}

如何使用 JAXB 映射这样的结构?

【问题讨论】:

    标签: java xml generics jaxb


    【解决方案1】:

    1) @XmlRootElement 在那里不是必需的。尝试仅将此注释放在真正的根元素中,例如您的示例中的 Operator。

    2) 如果您确定 List 应该完全包含 List,则不能使用泛型。只需创建两个单独的字段。

    可能的解决方案示例:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class List {
    
        @XmlAttribute(name="name")
        public String name;
    
        @XmlElement(name = "list")
        public List nestedList;
    
        @XmlElement(name = "property")
        public List<Property> properties;
    ...
    }
    

    【讨论】:

    • 完美!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多