Xml 使用XPath字符串解析SOAP消息

Xml 使用XPath字符串解析SOAP消息,xml,soap,xpath,xml-parsing,Xml,Soap,Xpath,Xml Parsing,使用在中定义的XPath方法 我可以轻松地访问XML字符串中的元素。但这不适用于我下面介绍的SOAP数据包。我得到的错误是“未声明SOAP-ENV” 我的XPath字符串 /SOAP-ENV:Envelope/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1] XML/SOAP消息 <?xml version="1.0" encoding="UTF-8"?> <SOAP-ENV:Envelope xmlns:SOAP-E

使用在中定义的XPath方法 我可以轻松地访问XML字符串中的元素。但这不适用于我下面介绍的SOAP数据包。我得到的错误是“未声明SOAP-ENV”

我的XPath字符串

/SOAP-ENV:Envelope/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1]

XML/SOAP消息

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SpRc="urn:SpRc">
    <SOAP-ENV:Body>
        <SpRc:ScanPortsResponse>
            <SpRc:PortDescs>
                <SpRc:item>
                    <SpRc:Serial>4215002032</SpRc:Serial>
                    <SpRc:TypeNumber>215</SpRc:TypeNumber>
                    <SpRc:Ip>4M5rAQ==</SpRc:Ip>
                    <SpRc:Mac>GDAAURgk</SpRc:Mac>
                    <SpRc:FirmwareVersion>1</SpRc:FirmwareVersion>
                    <SpRc:FirmwareVariant>0</SpRc:FirmwareVariant>
                    <SpRc:Port>1</SpRc:Port>
                    <SpRc:OutputType>28738</SpRc:OutputType>
                    <SpRc:Capabilities>97</SpRc:Capabilities>
                    <SpRc:InUse>1</SpRc:InUse>
                </SpRc:item>
            </SpRc:PortDescs>
            <SpRc:SpRcResult>0</SpRc:SpRcResult>
        </SpRc:ScanPortsResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

4215002032
215
4M5rAQ==
格达奥克
1.
0
1.
28738
97
1.
0

这似乎是XML名称空间的问题。您的XPath解析器似乎能够识别名称空间。在解析XML之前,请尝试在解析器中设置SOAP名称空间。

上面Abhinav Sarkar的回答是正确的,但我想详细说明一下。你需要使用

/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1]
而不是

/SOAP-ENV:Envelope/SOAP-ENV:Body/SpRc:ScanPortsResponse/SpRc:PortDescs[1]

因为XPATH会向后查找名称空间,如果父标记是定义名称空间的位置,那么它将不起作用。

我实际上在SOAP消息的根标记中定义了名称空间,我相信这就是XPATH找不到它的原因。如果我往下走一层就行了。