使用 JAXB 解组 XML

问题描述 投票:0回答:1

我有一些生成的类,看起来像这样:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Data", propOrder = {
    "body"
})
@XmlRootElement(name = "Data")
class Data {
    @XmlElement(name = "Body", required = true)
    protected Body body;
    // getter and setter
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Body", propOrder = {
    "content"
})
class Body {
    @XmlMixed
    @XmlAnyElement
    protected List<Object> content; 
    // getter
}

以及 XML 类型的其他一些类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Node1", propOrder = {
    "data",
})
class Node1 {
   @XmlElement(name = "Data")
   private String data;
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Node2", propOrder = {
    "int",
})
class Node2 {
   @XmlElement(name = "Int")
   private Integer int;
}

XML 示例如下:

<Data>
    <Body>
        <Node1>
           <Data>abc</Data>
        </Node1>
        <Node2>
           <Int>abc</Int>
        </Node2>
    </Body>
</Data>

当我尝试解组 XML 时,它返回一个

JAXBElement<Data>
,并且
Body.content
中的一些元素属于
ElementNSimpl
类型,其他元素只是其中带有换行符的字符串。

这就是我解组 XML 的方式:

private Object xmlToObject(String xmlString) throws Exception {
        var context = JAXBContext.newInstance(Data.class, Node1.class, Node2.class);
        var unmarshaller = context.createUnmarshaller();
        return unmarshaller.unmarshal(new StringReader(xmlString));
    }

我期望收到一个

Data
对象,它将包含
Body
对象,并且
Body
对象将包含两个元素,
Node1
Node2
,但是
Body.conent
中的元素是,如我说,
ElementNSimpl

java xml jaxb
1个回答
0
投票

当您解组时获得 JAXBElement,表明您的架构包含 2 个或更多相同复杂类型的全局元素。请参阅this文章了解更深入的解释。

当我尝试你的示例时,我确实直接获得了一个 Data 实例。没有 JAXBElement 包装器。

要获取 @Mixed @XmlAnyElement 列表属性中的映射类实例,映射的 Java 类需要使用 @XmlRootElement 进行注释,并且 @XmlAnyElement 必须将其 lax 属性设置为 true(请参阅 javadoc)。

© www.soinside.com 2019 - 2024. All rights reserved.