unmarshal easy xml

时间:2012-10-03 12:37:14

标签: java xml jaxb

我有简单的架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="error"  type="xs:string">
    </xs:element>
</xs:schema>

我使用JAXB从XML Schema生成Java代码。我只有一个班级:

@XmlRegistry
public class ObjectFactory {

    private final static QName _Error_QNAME = new QName("", "error");

    /**
     * Create a new ObjectFactory that can be used to create new instances of schema derived classes for package: error
     * 
     */
    public ObjectFactory() {
    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}{@link String }{@code >}}
     * 
     */
    @XmlElementDecl(namespace = "", name = "error")
    public JAXBElement<String> createError(String value) {
        return new JAXBElement<String>(_Error_QNAME, String.class, null, value);
    }

}

我通常使用此代码来解析XML:

 JAXBContext context = JAXBContext.newInstance(RootGenerateClass.class);
 Unmarshaller unmarshaller = context.createUnmarshaller();
 RootGenerateClass response = (RootGenerateClass) unmarshaller.unmarshal(streamWrapper.getStream());

在这种情况下我该怎么做(我没有rootGenerateClass)?我试试这个:

JAXBContext context = JAXBContext.newInstance(String.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
String response = (String) unmarshaller.unmarshal(streamWrapper.getStream());

当然不行((

3 个答案:

答案 0 :(得分:1)

假设您的ObjectFactory位于com.example包中,您应该可以

JAXBContext context = JAXBContext.newInstance("com.example");
Unmarshaller unmarshaller = context.createUnmarshaller();
JAXBElement<String> responseElt = (JAXBElement<String>) unmarshaller.unmarshal(streamWrapper.getStream());
String response = responseElt.getValue();

当您将包名称提供给JAXBContext.newInstance时,它会在该包中查找ObjectFactory类。

答案 1 :(得分:0)

您尚未在此处提及RootGenerateClass。同样没有意义的是将XML内容转换为JAVA类对象,并且该类应该具有与XML模式中相同的数据成员。因此,在第二种情况下,对String类对象不起作用将无效。

答案 2 :(得分:0)

非常感谢。 :) 我只是使用包装器作为根元素

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="error" type="RetroErrorType"/>
    <xs:complexType name="RetroErrorType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
</xs:schema>

JAXBContext context = JAXBContext.newInstance(String.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
String response = (String) unmarshaller.unmarshal(streamWrapper.getStream());

正常工作