【问题标题】:Parse CDATA from a SOAP Response with PHP使用 PHP 从 SOAP 响应中解析 CDATA
【发布时间】:2012-10-23 12:05:30
【问题描述】:

我正在尝试使用 SimpleXML 和 Xpath 从 SOAP 响应中解析出 CDATA。我得到了我正在寻找的输出,但返回的输出是一行连续的数据,没有允许我解析的分隔符。

感谢您的帮助!

这是包含我需要解析的 CDATA 的 SOAP 响应:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <ns1:getIPServiceDataResponse xmlns:ns1="http://ws.icontent.idefense.com/V3/2">
         <ns1:return xsi:type="ns1:IPServiceDataResponse" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
            <ns1:status>Success</ns1:status>
            <ns1:serviceType>IPservice_TIIncremental_ALL_xml_v1</ns1:serviceType>
            <ns1:ipserviceData><![CDATA[<?xml version="1.0" encoding="utf-8"?><threat_indicators><tidata><indicator>URL</indicator><format>STRING</format><value>http://update.lflink.com/aspnet_vil/debug.swf</value><role>EXPLOIT</role><sample_md5/><last_observed>2012-11-02 18:13:43.587000</last_observed><comment>APT Blade2009 - CVE-2012-5271</comment><ref_id/></tidata><tidata><indicator>URL</indicator><format>STRING</format><value>http://update.lflink.com/crossdomain.xml</value><role>EXPLOIT</role><sample_md5/><last_observed>2012-11-02 18:14:04.108000</last_observed><comment>APT Blade2009 - CVE-2012-5271</comment><ref_id/></tidata><tidata><indicator>DOMAIN</indicator><format>STRING</format><value>update.lflink.com</value><role>EXPLOIT</role><sample_md5/><last_observed>2012-11-02 18:15:10.445000</last_observed><comment>APT Blade2009 - CVE-2012-5271</comment><ref_id/></tidata></threat_indicators>]]></ns1:ipserviceData>
         </ns1:return>
      </ns1:getIPServiceDataResponse>
   </soapenv:Body>
</soapenv:Envelope>

这是我用来尝试解析 CDATA 的 PHP 代码:

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

    foreach ($xml->xpath("//ns1:ipserviceData") as $item)
    {
        echo '<pre>';
        print_r($item);           
        echo '</pre>';
    }            
?>

这是 print_r 输出:

SimpleXMLElement Object
(
    [0] => URLSTRINGhttp://update.lflink.com/aspnet_vil/debug.swfEXPLOIT2012-11-02 18:13:43.587000APT Blade2009 - CVE-2012-5271URLSTRINGhttp://update.lflink.com/crossdomain.xmlEXPLOIT2012-11-02 18:14:04.108000APT Blade2009 - CVE-2012-5271DOMAINSTRINGupdate.lflink.comEXPLOIT2012-11-02 18:15:10.445000APT Blade2009 - CVE-2012-5271
)

有什么想法可以使输出可用吗?例如,解析出 CDATA 输出的每个元素,例如:&lt;indicator&gt;&lt;/indicator&gt;, &lt;value&gt;&lt;/value&gt;, &lt;role&gt;&lt;/role&gt;, 等。

仅供参考 - 还尝试使用 LIBXML_NOCDATA,但输出没有变化。

【问题讨论】:

标签: php soap xpath xml-parsing simplexml


【解决方案1】:

你得到它作为一个单一的字符串,因为你已经要求 - 只是字符串。

如果您希望能够将该字符串解析为 XML,那么请从中创建一个新的 Simplexml 对象。

然后你在字符串上有另一个解析器可以解析 HTML(是的,很简单;Demo):

$soap = simplexml_load_string($soapXML);
$soap->registerXPathNamespace('ns1', 'http://ws.icontent.idefense.com/V3/2');
$ipserviceData = simplexml_load_string($soap->xpath('//ns1:ipserviceData')[0]);

// <threat_indicators><tidata><indicator>URL</indicator>
echo $ipserviceData->tidata->indicator, "\n"; # URL

顺便说一句,LIBXML_NOCDATA flagDocs 仅控制 &lt;![CDATA[...]]&gt; 部分是保留为 CDATA 节点还是合并到文本节点中。

【讨论】:

猜你喜欢
  • 2014-03-26
  • 2012-09-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多