为嵌套标记的对象解组xml

时间:2014-07-08 08:05:34

标签: java xml jaxb

我从他们的API获得了第三方提供商生成的一些类 - 特别是公司大楼(http://xmlgw.companieshouse.gov.uk/

我无法从API解组部分响应。我可以将对象强制转换为包含GovTalkMessage标记的Body对象 - 但是在解组后我得到的基础对象是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的内容(生成的List<Object> pojo中的GovTalkMessage)应该在列表的第一个元素中有一个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

我在unmarshal做错了吗?

提前致谢

更新

如果我将package-info.java修改为

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

而不是

namespace = "http://www.govtalk.gov.uk/CM/envelope"
然后是unmarshal的作品。但我无法将两者编组到GovTalkMessage并将CompanyAppointments解组为工作,即使我直接指定它:

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

这只会给我一个CompanyAppointments字段,其中包含空字符。

1 个答案:

答案 0 :(得分:0)

似乎用于生成绑定类的名称空间和响应中收到的名称空间是冲突的。

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

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

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