JAXB 父节点和子节点同名.子节点返回空值



我使用了一个 Web 服务,并且收到一个 XML 响应,其中包含一个同名的父节点和一个子节点。问题是最后一个层次结构没有值。

从我的角度来看,JAXB应该处理一个列表测试细节。

班级信封:

@XmlRootElement(name="Envelope", namespace="http://schemas.xmlsoap.org/soap/envelope/") 
@XmlAccessorType(XmlAccessType.FIELD)
public class Envelope {
@XmlElement(name="Body", namespace="http://schemas.xmlsoap.org/soap/envelope/")
private Body Body;
}

类体:

@XmlAccessorType(XmlAccessType.FIELD)
public class Body {
@XmlElement(name="GetTestlistWithConnectionsResponse", namespace="http://tempuri.org/")
private GetTestlistWithConnectionsResponse GetTestlistWithConnectionsResponse;
public Body() {}
}

类 GetTestlistWithConnectionsResponse:

@XmlAccessorType(XmlAccessType.FIELD)
public class GetTestlistWithConnectionsResponse {
public GetTestlistWithConnectionsResponse() {}
@XmlElement(name="GetTestlistWithConnectionsResult", 
namespace="http://tempuri.org/")
private GetTestlistWithConnectionsResult GetTestlistWithConnectionsResult;

}

Class GetTestlistWithConnectionsResult:

@XmlAccessorType(XmlAccessType.FIELD)
public class GetTestlistWithConnectionsResult {
public GetTestlistWithConnectionsResult() {}
@XmlElement(name="TestDetails", namespace="http://schemas.datacontract.org/XXX")
private TestDetails TestDetails ;
}

班级测试详情:

@XmlAccessorType(XmlAccessType.FIELD)
public class TestDetails{
public TestDetails() {}
@XmlElement(name="A", namespace="http://schemas.datacontract.org/XXX")
private String A;
@XmlElement(name="B", namespace="http://schemas.datacontract.org/XXX")
private String B;   
@XmlElement(name="TestDetails")
private List<TestDetails> TestDetails = new ArrayList<TestDetails>();
}

XML 结构:

    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
       <s:Body>
          <GetTestlistWithConnectionsResponse xmlns="http://tempuri.org/">
             <GetTestlistWithConnectionsResult xmlns:a="http://schemas.datacontract.org/XXX" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Error i:nil="true"/>
                <a:TestDetails>
                   <a:TestDetails>
                      <a:A>A</a:A>
                      <a:B>B</a:B>
                   </a:TestDetails>
                </a:TestDetails>
            </GetTestlistWithConnectionsResult>
           </GetTestlistWithConnectionsResponse>
       </s:Body>
    </s:Envelope>

解马歇尔方法:

public Envelope unmarshallFromFile(){
    Envelope testDetail= null;
    try {
        JAXBContext jaxbContext = JAXBContext.newInstance(Envelope.class);
        Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
        InputStream inStream = null;
        try {
            inStream = new FileInputStream(this.fileLoc);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        flightDetailsSN = (Envelope) jaxbUnmarshaller.unmarshal( inStream );
    } catch (JAXBException e) {
        e.printStackTrace();
    }
    return testDetail;
}

当我调用我的unmarshall 方法时,我收到一个带有空列表的 a:TestDetails 项的对象。我期待该列表包含一个值为 A 和 B 的元素。

XML中的AB是元素,而不是属性。尝试更改

@XmlAttribute
private String A;
private String B;

@XmlElement(name = "A")
private String a;
@XmlElement(name = "B")
private String b;

如果没有问题,可以通过更改子元素或子名称来尝试此操作。(我认为这是因为标题和子元素的名称相同。

<a:TestDetails>
    <a:TestDetail>
       <a:A>A</a:A>
       <a:B>B</a:B>
    </a:TestDetail>
</a:TestDetails>

相关内容

  • 没有找到相关文章

最新更新