我在Netbeans中使用JAXB 7.1.2。
我使用JAXB(新JAXB绑定)从模式中自动生成了我的类。我正在创建将使用编织器序列化为XML字符串的对象,然后从XML字符串返回到新的对象实例。但是,我得到以下例外:
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)
编组/序列化XML字符串正常工作。当它被解散/否定化的时候,引起了问题。
我正在使用以下代码来构建对象并将其纳入XML字符串:
// build the object
ObjectFactory of = new ObjectFactory();
MyQueryComplexType oaaqc = of.createMyQueryComplexType();
oaaqc.setField1("edit");
oaaqc.setField2("net");
oaaqc.setField3("24");
JAXBElement<MyQueryComplexType> createMyQueryComplexType = of.createMyQueryComplexTypeQuery(oaaqc);
// serialise to xml
StringWriter writer = new StringWriter();
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);
Marshaller m = context.createMarshaller();
m.marshal(createMyQueryComplexType, writer);
// output string to console
String theXML = writer.toString();
System.out.println(theXML);
这将在控制台中产生以下XML(格式化):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<MyQueryComplexTypeQuery xmlns="http://www.somewhere.com/some/path">
<Field1>edit</Field1>
<Field2>net</Field2>
<Field3>24</Field3>
</MyQueryComplexTypeQuery>
现在,我开始使用以下代码的新实例myquerycomplextype将字符串列为:
Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
在自动生成的软件包info.java中具有以下内容:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.somewhere.com/some/path", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package MyProject.SomeNamespace.MyQuery;
我认为对象 -> string->对象的简单过程将起作用。这是我第一次使用JAXB(所以要温柔)。我已经看到其他提到了名称空间的帖子,对我来说一切都还不错。我已经自动从模式中生成类,构造了对象,并编组为XML字符串。我认为简单地扭转Unmarshal的过程是相似的。
实际例外是在线上的:
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
我以为我在从字符串到对象的摘要进行了整理会很简单。我不知道我做错了什么还是缺少。我希望你们能散发出一些光线或睁开眼睛。
我删除了代码,以简化导致错误的应用中的内容。已更改了名称空间以保护网络上事物的身份。
有什么想法吗?
谢谢
andez
创建JAXBContext
对于从XML模式生成的JAXB模型,您可以在软件包名称上而不是在特定类上创建JAXBContext
:
JAXBContext context = JAXBContext.newInstance("your.package.name");
不是:
JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);
这将确保正确处理包含@XmlElementDecl
注释的ObjectFactory
类,这是您用例中缺少的。
unmarshal操作
请注意,在您需要将MyQueryComplexType
实例包装在JAXBElement
中的元帅操作中?这是因为MyQueryComplexType
没有用@XmlRootElement
注释,并且来自JAXBElement
所需的根元素信息。这意味着,当您执行Unmarshal操作时,您也将获得JAXBElement
。
JAXBElement<MyQueryComplexTypeQuery> o = (JAXBElement<MyQueryComplexType>) u.unmarshal(new StringReader(theXML));
不是:
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
有关更多信息
- http://blog.bdoughan.com/2012/07/jaxb-and-root-elements.html