我们有SOAP响应,我正在尝试解组这个或只是从namesp1:result字段获取值,但我总是得到值null,而在响应中,值设置为D.
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<namesp1:CheckTransactionDetailsResponse xmlns:namesp1="http://www.iesnare.com/dra/api/CheckTransactionDetails">
<namesp1:result xsi:type="xsd:string">D</namesp1:result>
<namesp1:reason xsi:type="xsd:string"/>
<namesp1:trackingnumber xsi:type="xsd:string">646498141355</namesp1:trackingnumber>
<namesp1:endblackbox xsi:type="xsd:string"/>
<namesp1:details>
<namesp1:detail>
<namesp1:name>device.cookie.enabled</namesp1:name>
<namesp1:value>1</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>device.flash.enabled</namesp1:name>
<namesp1:value>0</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>device.flash.installed</namesp1:name>
<namesp1:value>0</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>device.js.enabled</namesp1:name>
<namesp1:value>0</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>device.os</namesp1:name>
<namesp1:value>UNKNOWN</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>ipaddress</namesp1:name>
<namesp1:value>127.0.0.1</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>realipaddress</namesp1:name>
<namesp1:value>127.0.0.1</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>realipaddress.source</namesp1:name>
<namesp1:value>subscriber</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>ruleset.rulesmatched</namesp1:name>
<namesp1:value>0</namesp1:value>
</namesp1:detail>
<namesp1:detail>
<namesp1:name>ruleset.score</namesp1:name>
<namesp1:value>0</namesp1:value>
</namesp1:detail>
</namesp1:details>
</namesp1:CheckTransactionDetailsResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我使用了以下代码段:
按标记名称获取元素,响应如下:
Name namesp1:result
Value: null
使用过的Java代码:
SOAPBody sb = soapResponse.getSOAPBody();
Document d = sb.extractContentAsDocument();
NodeList nodeList = d.getElementsByTagNameNS("http://www.iesnare.com/dra/api/CheckTransactionDetails", "result");
for (int i = 0; i < nodeList.getLength(); i++) {
org.w3c.dom.Node nodeElement = nodeList.item(i);
System.out.println("Name " + nodeElement.getNodeName());
System.out.println("Value: " + nodeElement.getNodeValue());
}
解组对象的响应,我认为这是最好的方法。但后来我得到了以下例外。
Error occurred while sending SOAP Request to Server
java.lang.IllegalArgumentException: prefix xsd is not bound to a namespace
使用过的Java代码:
SOAPBody sb = soapResponse.getSOAPBody();
Document d = sb.extractContentAsDocument();
DOMSource source = new DOMSource(d);
CheckTransactionDetailsResponse checkTransactionDetailsResponse = (CheckTransactionDetailsResponse) JAXB.unmarshal(source, CheckTransactionDetailsResponse.class);
System.out.println();
System.out.println();
System.out.println("Result: " + checkTransactionDetailsResponse.getResult());
System.out.println();
System.out.println();
有人可以帮助我找到获得响应的正确方法,我更喜欢使用方法2,但我在互联网上看到这是JAXB中的一个错误。
由于
答案 0 :(得分:1)
方法1:
如果您阅读Node
的文档,您会发现Node.getNodeValue()
将始终返回null
个Element
个节点(请查看页面顶部的表格)。
原因是没有&#34;值&#34; XML元素的概念;您想要的值(字母D)是该元素的子节点(文本节点)。您必须遍历子节点,过滤文本节点才能获得您的价值。
方法2:
这里的问题来自DOMSource
的当前JAXB实现。保留细节,原因是名称空间声明出现在信封级别;剥离正文时,该声明在该DOM的序列化中丢失。
要让它重新使用包含架构类的包的package-info.java中的@XmlSchema
和@XmlNs
注释的组合。