我在 Netbeans 7.1.2 中使用 JaxB 时遇到问题。
我已经使用 JaxB(新 JaxB 绑定)从模式中自动生成了我的类。我正在创建将使用 Marshaller 序列化为 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));
在自动生成的 package-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;
我认为 object -> string -> object 的简单过程会起作用。这是我第一次使用 JaxB(所以要温柔)。我看过其他提到命名空间的帖子,对我来说一切都很好。我已经从模式中自动生成了类,构造了对象,编组为 xml 字符串。我认为简单地反转 unmarshal 的过程是相似的。
实际的异常是在线抛出的:
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
我以为我正在做从字符串到对象的解组会很简单。我不知道我是做错了什么还是错过了什么。我希望你们能给我一些启示或睁开我的眼睛。
我已经减少了代码以简化我的应用程序中导致错误的内容。命名空间已更改以保护网络上事物的身份。
有什么想法吗?
谢谢
安德斯