Java JaxB - XML到对象的XML对象

And*_*dez 15 xml jaxb

我在Netbeans 7.1.2中使用JaxB时遇到问题.

我使用JaxB(New JaxB Binding)从模式自动生成了我的类.我正在使用Marshaller创建将序列化为XML字符串的对象,然后从XML String返回到新的对象实例.但是,我得到以下异常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://www.somewhere.com/some/path", local:"MyQueryComplexTypeQuery"). Expected elements are (none)
Run Code Online (Sandbox Code Playgroud)

编组/序列化到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);
Run Code Online (Sandbox Code Playgroud)

这会在控制台中生成以下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>
Run Code Online (Sandbox Code Playgroud)

现在,我使用以下代码将字符串反序列化/解组化为新实例MyQueryComplexType:

Unmarshaller u = context.createUnmarshaller();
MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)

在auto生成的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;
Run Code Online (Sandbox Code Playgroud)

我认为对象的简单过程 - > string - >对象会起作用.这是我第一次使用JaxB(所以要温和).我看过其他帖子提到名称空间,一切看起来都不错.我已从模式自动生成类,构造了对象,编组为xml字符串.我认为简单地逆转unmarshal的过程会是类似的.

实际的异常被抛出:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)

我以为我正在做从字符串到对象的解组很简单.我不知道我做错了什么或遗漏了什么.我希望你们能摆脱一些亮光或睁开我的眼睛.

我已经减少了代码,以简化我的应用程序中导致错误的内容.已更改命名空间以保护Web上的事物的标识.

有什么想法吗?

谢谢

Andez

bdo*_*han 18

创造 JAXBContext

对于从XML模式生成的JAXB模型,您可以JAXBContext在包名称上创建,而不是在特定类上创建:

JAXBContext context = JAXBContext.newInstance("your.package.name");
Run Code Online (Sandbox Code Playgroud)

不:

JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);  
Run Code Online (Sandbox Code Playgroud)

这将确保正确处理ObjectFactory包含@XmlElementDecl注释的类,这是您的用例中缺少的内容.

Unmarshal Operation

请注意,在编组操作期间,您需要将实例包装MyQueryComplexType在一个JAXBElement?这是因为MyQueryComplexType没有注释,@XmlRootElement并且需要来自的根元素信息JAXBElement.这意味着当你进行解组操作时,你也会得到一个JAXBElement回复.

JAXBElement<MyQueryComplexTypeQuery> o = (JAXBElement<MyQueryComplexType>) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)

不:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));
Run Code Online (Sandbox Code Playgroud)

欲获得更多信息

  • 非常感谢Blaise.它现在正在使用JAXBContext.newInstance("your.package.name")并使用JAXBElement来解组.如果我能+100我愿意. (3认同)
  • @Andez你实际上可以+100.你可以在事后给出赏金. (2认同)