解组重新运行重复的空值

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;
    }
}

(在HeadertMLHeader中的所有字段添加@XmlElement注释)