2012-11-02 3 views
3

SimpleXML과 Xpath를 사용하여 SOAP 응답에서 CDATA를 파싱하려고합니다. 내가 찾는 결과를 얻지 만 반환되는 출력은 분리자를 사용하지 않고 연속적인 한 줄의 데이터로 구문 분석 할 수 있습니다.PHP로 SOAP 응답에서 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>'; 
    }    
?> 
: 여기

<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 코드입니다 : 여기

내가 구문 분석하는 데 필요한 CDATA를 포함하는 SOAP 응답입니다

다음은 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 
) 

출력을 사용 가능하게 만들 수있는 아이디어는 무엇입니까? 또한, 출력의 변화없이 LIBXML_NOCDATA을 사용하여 시도 - FYI <indicator></indicator>, <value></value>, <role></role>,

예를 들어, 등의 CDATA 출력의 각 요소를 분석.

+0

아래 URL을 확인하십시오. 그것은 나를 위해 작동 [https://stackoverflow.com/a/21330977/1248953](https://stackoverflow.com/a/21330977/1248953) –

답변

2

당신이 물어 보았기 때문에 당신은 그것을 하나의 문자열로 받아들입니다 - 그냥 문자열.

XML로 문자열을 구문 분석하려면 새 Simplexml 객체를 만들어야합니다.

$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 

Btw는의 LIBXML_NOCDATA flagDocs<![CDATA[...]]> 부분 CDATA 노드로 보존 또는 병합 여부를 제어합니다 (Demo 예 간단) 다음

당신은 HTML을 구문 분석 할 수있는 문자열의 다른 파서를 텍스트 노드.

+0

현재 stable 5.4보다 작은 PHP 버전을 사용하는 경우 http://codepad.org/rjvqR8gH – hakre

관련 문제