gpt4 book ai didi

xml - Java JaxB - 对象到 XML 字符串到对象

转载 作者:数据小太阳 更新时间:2023-10-29 01:39:59 24 4
gpt4 key购买 nike

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

我已经使用 JaxB(新 JaxB 绑定(bind))从模式自动生成了我的类。我正在创建将使用 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;

我认为对象 -> 字符串 -> 对象的简单过程可行。这是我第一次使用 JaxB(所以要温和)。我看过其他提到命名空间的帖子,我觉得一切正常。我已经从架构中自动生成了类,构建了对象,并编码为 xml 字符串。我认为简单地反转 unmarshal 的过程是相似的。

实际的异常是在线抛出的:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));

我以为我正在做从字符串到对象的解码会很简单。我不知道我是做错了什么还是遗漏了什么。我希望你们能给我一些启示或开阔我的眼界。

我已经减少了代码以简化我的应用程序中导致错误的内容。命名空间已更改以保护网络上事物的身份。

有什么想法吗?

谢谢

安德斯

最佳答案

创建 JAXBContext

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

JAXBContext context = JAXBContext.newInstance("your.package.name");

不是:

JAXBContext context = JAXBContext.newInstance(MyQueryComplexType.class);  

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

解码操作

请注意,在编码操作期间,您需要将 MyQueryComplexType 实例包装在 JAXBElement 中吗?这是因为 MyQueryComplexType 没有用 @XmlRootElement 注释,根元素信息需要来自 JAXBElement。这意味着当您执行解码操作时,您也会得到一个 JAXBElement

JAXBElement<MyQueryComplexTypeQuery> o = (JAXBElement<MyQueryComplexType>) u.unmarshal(new StringReader(theXML));

不是:

MyQueryComplexTypeQuery o = (MyQueryComplexType) u.unmarshal(new StringReader(theXML));

了解更多信息

关于xml - Java JaxB - 对象到 XML 字符串到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13289404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com