我有一些生成的类,看起来像这样:
@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
当您解组时获得 JAXBElement,表明您的架构包含 2 个或更多相同复杂类型的全局元素。请参阅this文章了解更深入的解释。
当我尝试你的示例时,我确实直接获得了一个 Data 实例。没有 JAXBElement 包装器。
要获取 @Mixed @XmlAnyElement 列表属性中的映射类实例,映射的 Java 类需要使用 @XmlRootElement 进行注释,并且 @XmlAnyElement 必须将其 lax 属性设置为 true(请参阅 javadoc)。