【问题标题】:unmarshal xml to object for a nested tag将 xml 解组为嵌套标签的对象
【发布时间】:2014-07-09 01:16:27
【问题描述】:

我从第 3 方提供商那里为他们的 API 生成了一些类 - 特别是 Companies House (http://xmlgw.companieshouse.gov.uk/)

我在解组来自 API 的响应部分时遇到问题。我可以将对象转换为包含Body 标记的GovTalkMessage 对象 - 但我在解组后返回的底层对象是ElementNSImpl 对象,而不是预期的pojo。

示例

我创建了一个这样的请求:http://xmlgw.companieshouse.gov.uk/examples/companydetails_req.xml

并得到这样的回复:http://xmlgw.companieshouse.gov.uk/examples/companydetails_reply.xml

在回复中可以看到有:

<Body>
<CompanyDetails xmlns="http://xmlgw.companieshouse.gov.uk/v1-0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlgw.companieshouse.gov.uk/v1-0/schema/CompanyDetails-v2-1.xsd">
    ...
</Body>

因此,Body 的内容(即生成的GovTalkMessage pojo 中的List&lt;Object&gt;)在列表的第一个元素中应该有一个CompanyDetails 对象。相反,我有ElementNSImpl

这是编组代码,它工作正常 - 可以将其发送到 API 端点并返回一个 xml 响应,如上面的示例:

JAXBContext context = JAXBContext.newInstance(GovTalkMessage.class, CompanyDetailsRequest.class, CompanyDetails.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

InputStream in = Request.Post ... //omitted - send to server, get response

Unmarshaller unmarshaller = context.createUnmarshaller();
GovTalkMessage reply = (GovTalkMessage)unmarshaller.unmarshal(in); //ok
Object object = reply.getBody().getAny().get(0); 
//object is ElementNSImpl - should be CompanyDetails

我在解组中做错了吗?

提前致谢

更新

如果我修改package-info.java

namespace = "http://xmlgw.companieshouse.gov.uk/v1-0/schema"

而不是

namespace = "http://www.govtalk.gov.uk/CM/envelope"

然后解组工作。但我无法让 both 编组到 GovTalkMessage 并解组到 CompanyAppointments 工作,即使我直接指定它:

JAXBContext payloadContext = JAXBContext.newInstance(CompanyAppointments.class);
Unmarshaller unmarshaller = payloadContext.createUnmarshaller();
unmarshaller.unmarshal((Node)message.getBody().getAny().get(0), CompanyAppointments.class).getValue();

这只是给了我一个CompanyAppointments,其中的字段充满了空值。

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    似乎用于生成绑定类的命名空间与响应中收到的命名空间存在冲突。

    这里需要绑定类和 XML 响应来指出错误:)。

    我建议您使用包名代替类来创建 JAXBContext。

    final JAXBContext context = JAXBContext.newInstance("com.something"...);
    

    【讨论】:

    • 谢谢;响应和请求在 OP 中,CompanyAppointments 刚刚从 xmlgw.companieshouse.gov.uk/v1-0/schema/… 生成...尝试将包名称放在那里没有影响,请参阅我的更新 - 我认为与根元素的命名空间有关
    猜你喜欢
    • 2011-09-24
    • 2010-12-25
    • 2011-01-30
    • 1970-01-01
    • 2018-04-17
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多