我使用了一个 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中的A
和B
是元素,而不是属性。尝试更改
@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>