我正在尝试根据this从this 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)
有谁知道我做错了什么?
答案 0 :(得分:0)
我认为您的XML文件是由两个XSD定义的。见这里:
xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/netconvertConfiguration.xsd"
和xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/net_file.xsd
您将会错过net
或configuration
元素。
我不知道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这真的是过度设计但无论如何:)