解组重新运行重复的空值
Unmarshalling retruns duplicate empty values
我已尝试解组此 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;
}
}
提前致谢
您需要为字段添加命名空间。
为了 Envelope
class 可以看起来像这样。
@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;
}
}
(在Header
和tMLHeader
中的所有字段添加@XmlElement
注释)
我已尝试解组此 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;
}
}
提前致谢
您需要为字段添加命名空间。
为了 Envelope
class 可以看起来像这样。
@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;
}
}
(在Header
和tMLHeader
中的所有字段添加@XmlElement
注释)