【发布时间】:2019-02-14 06:02:08
【问题描述】:
我有一个应用程序使用 Jaxb 进行 XML转换,并使用 maven-jaxb2-plugin 自动生成类。
在我的架构深处,我可以输入“ANY”xml。
更新:这更好地描述了我的架构。一些已知的 XML 包装了一个完全未知的部分(“任何”部分)。
<xs:complexType name="MessageType">
<xs:sequence>
<xs:element name="XmlAnyPayload" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:any namespace="##any"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="OtherElements">
....
</xs:sequence>
这(通过 jaxb)映射到这样的内部类。
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"any"
})
public static class XmlAnyPayload {
@XmlAnyElement(lax = true)
protected Object any;
当我解组整个结构时,没问题。 “Object any”将呈现为 org.apache.xerces.dom.ElementNSImpl。现在,我想手动重新创建 Java 对象,然后转到 XML。如何获取一些随机 XML 并放入 any (org.apache.xerces.dom.ElementNSImpl) 元素以构建 Java 对象?
另外,下一种情况是当我将此元素作为 java 时,我想解组这部分(以便能够提取此元素的 XML 字符串)。但这是不可能的。我得到一个关于根元素的例外。但是不能对 ElementNSImpl 进行注解。
unable to marshal type "com.sun.org.apache.xerces.internal.dom.ElementNSImpl" as an element because it is missing an @XmlRootElement annotation
您对如何处理这些问题有什么建议吗?
【问题讨论】:
-
感谢对该域的良好输入,我设法解决了这个问题。一种方法是,我坚持使用我的 Dom 节点。只是添加了一些简单的 XML 解析来从字符串中获取 dom。另一种方式,我求助于在 DOM 空间中使用 XML(XPATH 明智),因为它实际上为我节省了一些时间和上下文切换。 XPATH 实际上非常适合降低代码复杂度。