2012-06-28 61 views
0

我能當我知道的命名空間,並請求名稱解析XML SOAP解析SOAP。如何才能列出所有請求和對象名稱

因爲我有不同的SOAP請求,我想在SOAP文件,以獲取請求名稱。

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope 
    xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" 
    xmlns:ns1="http://schema.example.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" 
    SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" 
> 
<SOAP-ENV:Body> 
**<ns1:SendMailling>** 
<campagne xsi:type="ns1:Campaign"><ActivateDedup xsi:nil="true"/><BillingCode  xsi:nil="true"/><DeliveryFax xsi:type="ns1:DeliveryFax"/> 
<DeliveryMail xsi:type="ns1:DeliveryMail"> 
... 

PHP代碼:我SOAP的一部分摘錄

if(is_file($file)) 
    { 
     $content=file_get_contents($file); 


     $xml = simplexml_load_string($content); 
     $xml->registerXPathNamespace('ns1', 'http://schema.example.com'); 



     foreach ($xml->xpath('\\SOAP-ENV:') as $item) 
     { 
      //certainly the bad way? 
      echo "<pre>"; 
       print_r($item); 
      echo "</pre>"; 

     } 

     echo "<pre>"; 
      print_r($xml); 
     echo "</pre>"; 


    } 

我沒有得到任何結果。我想使出現: 'SendMailling'(識別請求名)

當我明確指定

//foreach($xml->xpath('//ns1:SendMailling') as $item) 

沒有問題。

我試圖foreach($xml->xpath('//ns1') as $item)
$xml->xpath('//SOAP-ENC'), $xml->xpath('//Body')但...

+0

所以你actualy的問題是,你想知道你怎麼能在XML文檔中得到使用的命名空間的列表? - http://php.net/manual/simplexmlelement.getnamespaces。php – hakre

回答

0

我有問題了解你的問題,所以這可能不是問題的答案。

如果我理解你的權利,你要選擇所有元素節點是的<SOAP-ENV:Body>直接孩子,並且是在ns1/http://schema.example.com命名空間。

您已經註冊了命名空間前綴與SimpleXMLElement::xpath使用:

$xml->registerXPathNamespace('ns1', 'http://schema.example.com'); 

您尚未註冊的SOAP-ENV/http://schemas.xmlsoap.org/soap/envelope/命名空間,據我所看到的。

在XPath匹配你可以指定它的命名空間的元素。有多種方法如何做到這一點:

*    All elements in any namespace. 
prefix:*  All elements in namespace "prefix" (registered prefix) 
prefix:local Only "local" elements in namespace "prefix" 

例如,要選擇具有ns1前綴的所有元素:

//ns1:* 

您可能需要限制這一點,因爲你只需要直接孩子withn <SOAP-ENV:Body>所以寄存器與SOAP-ENV前綴和命名空間擴展上面的XPath:

/SOAP-ENV:Body/ns1:* 

這應該在n擁有你正在尋找的所有元素。再次


(OP :)謝謝,當我做了

foreach ($xml->xpath('//SOAP-ENV:Body/ns1:*') as $item) { 
    echo $item->getName() . "<br>"; 
} 

一切正常,我得到請求名稱'SendMailling'

+0

非常感謝,這正是我一直在尋找的。 – Gilles

+0

@Gilles,如果它幫助你,請接受答案。你知道如何接受答案的作品? http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – hakre

相關問題