3

SimpleXMLとXpathを使用してSOAP応答からCDATAを解析しようとしています。探している出力が得られますが、返される出力は、解析を可能にする区切り文字のない1行のデータです。

助けてくれてありがとう!

解析する必要のある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出力の各要素を解析します<indicator></indicator>, <value></value>, <role></role>,

参考までに-出力を変更せずにLIBXML_NOCDATAを使用してみました。

4

1 に答える 1

3

あなたがそれを求めたので、あなたはそれを単一の文字列として取得します-文字列だけです。

その文字列を 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

ところで、DocsLIBXML_NOCDATAフラグ<![CDATA[...]]>は、パーツを CDATA ノードとして保持するか、テキスト ノードにマージするかのみを制御します。

于 2012-11-02T20:03:25.293 に答える