编程语言
首页 > 编程语言> > 使用PHP中的命名空间解析SOAP响应

使用PHP中的命名空间解析SOAP响应

作者:互联网

参见英文答案 > parse an XML with SimpleXML which has multiple namespaces                                     5个
有关如何解析此SOAP响应并获取report_type的name值的任何建议?请注意,有两个名称实例;一个在report_type下,另一个在严重性下.

这是SOAP响应

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns1:getIRResponse xmlns:ns1="http://ws.icontent.idefense.com/V3/2">
         <ns1:return xsi:type="ns1:IRResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ns1:report_type>
               <ns1:id>0</ns1:id>
               <ns1:name>Original Vulnerability</ns1:name>
            </ns1:report_type>
            <ns1:severity>
                <ns1:id>0</ns1:id>
                <ns1:name>HIGH</ns1:name>
            </ns1:severity>
         </ns:return>
      </ns1:getIRResponse>
   </soapenv:Body>
</soapenv:Envelope>

这是我正在使用的PHP代码:

<?php        
    $xml = simplexml_load_string($response);    
    $xml->registerXPathNamespace('ns1', 'http://ws.icontent.idefense.com/V3/2');

    foreach ($xml->xpath('//ns1:report_type/name') as $item)
    {
        echo 'Name: '.$item,'<br>';               
    } 
?>

PHP代码不会回显任何内容.当我使用($xml-> xpath(‘// ns1:name’)作为$item)时,它返回两个名称(Original Vulnerability和HIGH).

我知道我错过了一些愚蠢的东西.你能帮帮忙吗?先感谢您!

解决方法:

首先,我已经纠正了这个元素

</ns:return>

并改为

</ns1:return>

我似乎通过在两个xpath段中复制名称空间前缀来获得您所追求的结果

$xml = simplexml_load_string($response);    
$xml->registerXPathNamespace('ns1','http://ws.icontent.idefense.com/V3/2');
foreach ($xml->xpath('//ns1:report_type/ns1:name') as $item)
{
  echo 'Name: '.$item,'<br>';
}            

产量

Name: Original Vulnerability

标签:php,soap,xml-parsing,xml-namespaces,simplexml
来源: https://codeday.me/bug/20190901/1784088.html