如何使用javax.xml.bind.Unmarshaller仅解组单个嵌套元素

时间:2015-08-20 06:38:53

标签: xml xsd jaxb unmarshalling javax.xml

我有以下示例xsd

 <annotation><appinfo>
<jaxb:schemaBindings>
    <jaxb:package name="com.myapp"/>
</jaxb:schemaBindings>
</appinfo></annotation>
<element name="user">
    <complexType>
        <sequence>
            <element name="roles" type="u:Roles" minOccurs="1"></element>
        </sequence>
        <attribute name="name" type="string"></attribute>
    </complexType>
</element>

<complexType name="Role">
    <complexContent>
        <extension base="u:Role">
            <attribute name="name" type="string"></attribute>
            <attribute name="action" type="string"></attribute>
        </extension>
    </complexContent>
</complexType>

我想解除像样本一样的角色xml,如下所示

        JAXBContext c = JAXBContext.newInstance(User.class, Roles.class, Role.class);
    Unmarshaller unmarshaller = c.createUnmarshaller();
    JAXBElement ele = (JAXBElement) unmarshaller.unmarshal(inputStream);
    return (Roles) ele.getValue();

我的输入流/ xml是

<roles>
    <role name="admin" action="all"/>
    <role name="recep" action="select"/>
</roles>

以上代码会引发以下错误

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.myapp.com/xsd/internal/myapp", local:"roles"). Expected elements are <{http://www.myapp.com/xsd/internal/myapp}User>

如何让我的角色xml成为unmarshall?

1 个答案:

答案 0 :(得分:1)

如果您知道要解组的课程,请使用unmarshal(Source source, Class<T> declaredType)和喜欢。

请尝试unmarshaller.unmarshall(source, Roles.class),这会给你JAXBElement<Roles>。然后,您可以getValue()从中获取Roles的实例。

如果你提供了解组的类,根元素名称根本不重要,JAXB并不需要“知道”它。