【发布时间】:2021-12-25 22:06:26
【问题描述】:
我试图解组这个 xml sn-p
<?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;
}
}
提前致谢
【问题讨论】: