Intereting Posts
Отправка JSON через AJAX на PHP с помощью jQuery Вложенные XML-таблицы MySQL с использованием php Неопределенная переменная: _SESSION при отправке переменных через сообщение через триггер JavaScript Кто-нибудь имеет скрипт для создания горизонтального градиента (слева направо) с помощью PHP? Разница PHP между Curl и HttpRequest MYSQL не возвращает результат PHP при запросе только для первого рейтинга Извлечение параметров URL с регулярным выражением – повторение группы захвата Как синхронизировать FTP-каталог из командной строки? Формат цены в текущем регионе и валюте Любой способ определить выбранный внутри тега <select>, а не на <option> Как создать раскрывающееся меню Laravel Blade без лишних пробелов? Перемещение описания категории в нижней части страницы в WordPress Доступ к уникальным парам значений из массива без повторения Как бы вы запустили запрос на получение через curl на веб-сайте с поддержкой ssl?

Разбор CDATA из SOAP-ответа с PHP

Я пытаюсь разобрать 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 без изменения вывода.

Solutions Collecting From Web of "Разбор CDATA из SOAP-ответа с PHP"

Вы получаете его как одну строку, потому что вы просили об этом – просто строку.

Если вы хотите иметь возможность анализировать эту строку как 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 или объединены в текстовые узлы.