无法使用生成的JAXB类解析XML文件

时间:2016-02-05 11:44:28

标签: java xsd jaxb xjc

我正在尝试根据thisthis tutorial xsd文件生成JAXB绑定。首先我注意到有一些依赖,但我设法让它们离开相同的地址。下载后我跑了

xjc net_file.xsd

这确实产生了一些java代码,但是与教程中的不同,文件看起来像" ... Type.java"。我发现这很不方便,但我可以忍受它。 之后我尝试解析given示例文件:

File file = new File("quickstart.net.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(NetType.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
NetType net = (NetType) jaxbUnmarshaller.unmarshal(file);

但是,我得到以下例外:

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"net"). Expected elements are (none)

有谁知道我做错了什么?

2 个答案:

答案 0 :(得分:0)

我认为您的XML文件是由两个XSD定义的。见这里:

xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/netconvertConfiguration.xsd"xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/net_file.xsd

您将会错过netconfiguration元素。

我不知道JAXB如何支持部分XSD。你确定你正确地遵循了教程吗?您应该能够将这两个xsd文件合并为一个(?)。

答案 1 :(得分:0)

好吧,我发现了问题。您似乎确实需要使用生成的ObjectFactory。我修改了这样的代码:

    File file = new File("quickstart.net.xml");
    JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    JAXBElement<NetType> netElement = (JAXBElement<NetType>) jaxbUnmarshaller.unmarshal(file);

现在一切正常。我想原因是ObjectFactory有一个带注释的构建器方法:

/**
 * Create an instance of {@link JAXBElement }{@code <}{@link NetType }{@code >}}
 * 
 */
@XmlElementDecl(namespace = "", name = "net")
public JAXBElement<NetType> createNet(NetType value) {
    return new JAXBElement<NetType>(_Net_QNAME, NetType.class, null, value);
}

Imho这真的是过度设计但无论如何:)