Java Jaxb-对XML字符串对象对象



我在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

最新更新