簡體   English   中英

將XML解組為嵌套標簽的對象

[英]unmarshal xml to object for a nested tag

我從第三方供應商那里獲得了一些針對其API的生成的類-特別是Companies House( 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>

因此, GovTalkMessage的內容(在生成的GovTalkMessage pojo中為List<Object> )應該在列表的第一個元素中具有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"

然后元帥工作。 但是,即使我直接指定它,我也無法將 GovTalkMessage送到GovTalkMessage並將其GovTalkMessage送到CompanyAppointments中。

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

這只是給我一個CompanyAppointments其中的字段充滿了空值。

似乎用於生成綁定類的名稱空間與響應中收到的名稱空間發生沖突。

綁定類和XML響應將需要在此處指出錯誤:)。

我建議您使用包名稱代替用於創建JAXBContext的類。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM