![](/img/trans.png)
[英]How to unmarshal XML file that contains mixed tag (has attributes, and has content value with nested tag) with JAXB?
[英]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.