Java SOAP字段始终返回null作为值

Java SOAP字段始终返回null作为值,java,soap,Java,Soap,我们有一个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-E

我们有一个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>
使用的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());
    }
    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();
使用的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());
    }
    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中的一个bug

谢谢方法1: 如果您阅读了
节点的文档
,您会意识到
节点.getNodeValue()
对于
元素
节点总是返回
null
(请查看页面顶部的表)

原因是XML元素没有“值”概念;您想要的值(字母D)是该元素的子节点(文本节点)。您必须遍历子节点,过滤文本节点,才能获得值

方法2: 这里的问题源于当前的
DOMSource
的JAXB实现。保留细节,原因是名称空间声明存在于信封级别;剥离主体时,该声明将在该DOM序列化时丢失

要将其取回,请在包含模式类的包的package-info.java中结合使用
@XmlSchema
@XmlNs
注释。

方法1: 如果您阅读了
节点的文档
,您会意识到
节点.getNodeValue()
对于
元素
节点总是返回
null
(请查看页面顶部的表)

原因是XML元素没有“值”概念;您想要的值(字母D)是该元素的子节点(文本节点)。您必须遍历子节点,过滤文本节点,才能获得值

方法2: 这里的问题源于当前的
DOMSource
的JAXB实现。保留细节,原因是名称空间声明存在于信封级别;剥离主体时,该声明将在该DOM序列化时丢失

要将其取回,请在包含模式类的包的package-info.java中结合使用
@XmlSchema
@XmlNs
注释