0

首先,我有一个 XSD,其中包含对 commentType 对象的引用:

...
<xs:complexType>
    <xs:sequence>
        <xs:element name="entry" type="ref:commentType">
...

commentType 被描述为(相同的 XSD):

...
<xs:complexType name="commentType" mixed="true">
    <xs:annotation>
        <xs:documentation>Some text</xs:documentation>
    </xs:annotation>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
        <xs:any/>
    </xs:sequence>
    <xs:attribute name="date" type="xs:dateTime" use="required"/>
    <xs:attribute name="type" use="optional" default="PRODUCT">
        <xs:simpleType>
            <xs:restriction base="xs:token">
                <xs:enumeration value="PRODUCT"/>
                <!--Several values-->
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
</xs:complexType>
...

在我使用 Jaxb 解析的 XML 文件中,entry 指的是 opDetails 对象,该对象在另一个 XSD 中定义......

...
<entry date="2010-03-26T10:40:27Z" type="PRODUCT">
    <opDetails xmlns="http://path/to/opDetails">
        <!--Object properties-->
    </opDetails>
...

(为了清楚起见,我简化了名称和结构)

问题 :

如何在我的代码中正确映射这个其他对象?

我有一个 entry.getContent(),它是 TinyElementImpl 的列表。

显然,生成 2 个 xsd 的类并尝试将 TinyElementImpl 转换为 opDetails 不是一种选择:)

4

1 回答 1

0

我找到了答案

unmarshall 也适用于节点。 http://docs.oracle.com/javaee/5/api/javax/xml/bind/Unmarshaller.html

我的代码:

org.w3c.dom.Node nodeEntryContent = (org.w3c.dom.Node)entry.getContent().get(0);

JAXBContext ctx;
Unmarshaller um;
opDetails dOp = null;
try {
    ctx = JAXBContext.newInstance("package.of.opDetails.containing.xjc.generated.classes");
    um = ctx.createUnmarshaller();
    dOp = (opDetails)um.unmarshal(nodeEntryContent);
} catch (JAXBException e1) {
    System.out.println("XML parsing error" + e1.getMessage());
}
于 2012-12-12T14:42:59.977 回答