Я пытаюсь разобрать CDATA из ответа SOAP с помощью SimpleXML и Xpath. Я получаю вывод, который я ищу, но возвращаемый результат – это одна непрерывная строка данных без разделителей, что позволило бы мне разобрать.
Я ценю любую помощь!
Вот ответ SOAP, содержащий CDATA, который мне нужно проанализировать:
<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>
Вот PHP-код, который я использую, чтобы попытаться разобрать CDATA:
<?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, например: <indicator></indicator>, <value></value>, <role></role>,
т. Д.
FYI – также пытался использовать LIBXML_NOCDATA без изменения вывода.
Вы получаете его как одну строку, потому что вы просили об этом – просто строку.
Если вы хотите иметь возможность анализировать эту строку как XML, тогда создайте из него новый объект Simplexml.
Затем у вас есть еще один синтаксический анализатор строки, который может анализировать HTML (да, это просто: демонстрация ):
$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
флаг LIBXML_NOCDATA
Документы управляют только тем, LIBXML_NOCDATA
ли части <![CDATA[...]]>
как узлы CDATA или объединены в текстовые узлы.