我試圖解組這個 xml 片段
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Header>
<ns1:tMLHeader soapenv:actor="http://schemas.xmlsoap.org/soap/actor/next" soapenv:mustUnderstand="0"
xmlns:ns1="http://tml.t1m1.org/tML.Transport.xsd">
<ns1:TransportID>111-23-Some_code--12</ns1:TransportID>
<ns1:ApplicationType>Any_type</ns1:ApplicationType>
<ns1:ApplicationVersion>1.0</ns1:ApplicationVersion>
<ns1:From>XXX</ns1:From>
<ns1:To>YY_G</ns1:To>
<ns1:SendTimestamp>2021-11-11T10:25:56.858-06:00</ns1:SendTimestamp>
<ns1:RetryCount>0</ns1:RetryCount>
</ns1:tMLHeader>
</soapenv:Header>
<soapenv:Body>
<processSyncRequestResponse xmlns="java:lsr.webservice.wisor.com">
<response xmlns="">mocked response</response>
</processSyncRequestResponse>
</soapenv:Body>
</soapenv:Envelope>
但是盡管我采取了行動,結果總是幾乎相同(4 個或 2 個空欄位):
{
"Header": null,
"Body": null,
"header": null,
"body": null
}
我之前的操作是:定義建構式(所有欄位,無欄位)并添加 setter 和 getter 并標記為 @XmlElement。將@XmlType 用于具有屬性順序的子類。還有一些使用 package-info 和 ObjectFactory 的嘗試。我從 Stack Overflow 的示例中嘗試過的當前版本:由于所有欄位的名稱都匹配 xml 欄位,因此僅使用 @XmlAccessorType(XmlAccessType.FIELD) 以及 getter 和 setter。但結果還是一樣。有人可以幫我解釋一下它是如何作業的嗎?
解組:
File xml = new File("test.xml");
return (Envelope)JAXBContext
.newInstance(Envelope.class)
.createUnmarshaller()
.unmarshal(xml);
課程:
@XmlRootElement(name="Envelope",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {
public Header Header;
public Body Body;
public Header getHeader() {
return Header;
}
public void setHeader(Header header) {
Header = header;
}
public Body getBody() {
return Body;
}
public void setBody(Body body) {
Body = body;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class Header {
public tMLHeader tMLHeader;
public tMLHeader gettMLHeader() {
return tMLHeader;
}
public void settMLHeader(tMLHeader tMLHeader) {
this.tMLHeader = tMLHeader;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class tMLHeader {
public String TransportID;
public String ApplicationType;
public double ApplicationVersion;
public String From;
public String To;
public Date SendTimestamp;
public int RetryCount;
public String getTransportID() {
return TransportID;
}
public void setTransportID(String transportID) {
TransportID = transportID;
}
....//other setters and getters
@XmlAccessorType(XmlAccessType.FIELD)
public class Body {
@XmlElement(name = "processSyncRequestResponse")
public ProcessSyncRequestResponse processSyncRequestResponse;
public ProcessSyncRequestResponse getProcessSyncRequestResponse() {
return processSyncRequestResponse;
}
public void setProcessSyncRequestResponse(ProcessSyncRequestResponse processSyncRequestResponse) {
this.processSyncRequestResponse = processSyncRequestResponse;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
public class ProcessSyncRequestResponse {
public String response;
public String getResponse() {
return response;
}
public void setResponse(String response) {
this.response = response;
}
}
提前致謝
uj5u.com熱心網友回復:
您需要為欄位添加命名空間。
對于Envelope看起來像這樣的類。
@XmlRootElement(name="Envelope",namespace = "http://schemas.xmlsoap.org/soap/envelope/")
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {
@XmlElement(name="Header", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
private Header header;
@XmlElement(name="Body", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
public Body body;
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header = header;
}
public Body getBody() {
return Body;
}
public void setBody(Body body) {
this.body = body;
}
}
(添加@XmlElement的注釋的所有欄位Header和tMLHeader)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359604.html
