9

如果有办法,如何做到这一点,我想知道最优雅的一种。这是问题: - 假设您有一个抽象类 Z - 您有两个从 Z 继承的类:名为 A 和 B。

您可以像这样编组任何实例(A 或 B):

JAXBContext context = JAXBContext.newInstance(Z.class);
Marshaller m = context.createMarshaller();
m.marshal(jaxbObject, ...an outputstream...);

在生成的 XML 中,您可以看到它是什么类型的实例(A 或 B)。

现在,你如何解组喜欢

JAXBContext jc = JAXBContext.newInstance(Z.class);
Unmarshaller u = jc.createUnmarshaller();
u.unmarshal(...an inputstream...)

我得到一个 UnmarshalException 说

"Exception Description: A descriptor with default root element {<my namespace>}<the root tag, e.g. A or B> was not found in the project]

javax.xml.bind.UnmarshalException"

那么如何进行解组以获得 Z 的实例,然后可以在解组后进行测试,它是什么?例如 z instanceof A then... z instanceof B then something else... 等等。

感谢您提供任何想法或解决方案。

我正在使用 JRE1.6 和 MOXy 作为 JAXB Impl。

4

4 回答 4

4

这里有一个类似的问题。

是否有可能通过提供来解组Person.class并且解组者发现自己,是否必须解组到ReceiverPerson.classSenderPerson.class

@XmlRootElement(name="person")
public class ReceiverPerson extends Person {
  // receiver specific code
}

@XmlRootElement(name="person")
public class SenderPerson extends Person {
  // sender specific code (if any)
}

// note: no @XmlRootElement here
public class Person {
  // data model + jaxb annotations here
}
于 2011-04-01T14:51:24.897 回答
1

我的问题没有解决方案!

在任何情况下,您都必须准确地告诉解组器它应该解组到哪个对象。

于 2011-05-02T08:22:19.723 回答
1

那么如何进行解组以获得 Z 的实例,然后您可以在解组之后进行测试,它是什么?例如 z instanceof A then... z instanceof B then >something else...等。

这应该工作...

Unmarshaller u = jc.createUnmarshaller();
Object ooo = u.unmarshal( xmlStream );
if ( ooo instanceof A )
{
    A myAclass = (A)ooo;
}
else if ( ooo instanceof B )
{
    B myBclass = (B)ooo;
}

我自己对此进行了测试,并且可以正常工作。

于 2011-08-25T20:00:38.660 回答
0

每个XML 文档都必须有一个根元素,如果您想对两个实例使用相同的 UnMarshaller,您唯一的可能就是拥有一个共同的根元素,例如:

<root>
  <A></A>
</root>

你的 xsd 文件看起来像这样

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:annotation>
        <xs:documentation>
        example for stackoverflow
    </xs:documentation>
    </xs:annotation>
    <xs:element name="root" type="rootType"/>
    <xs:complexType name="rootType">
            <xs:choice>
                <xs:element name="A" type="AType"/>
                <xs:element name="B" type="BType"/>
            </xs:choice>
    </xs:complexType>

    ... your AType and BType definitions here

</xs:schema>
于 2011-04-01T12:42:41.167 回答