2013-09-26 82 views
3

我從每個響應中具有零個或多個不同類型事務的SOAP服務器獲得響應。從服務器響應獲取肥皂xsi:類型

每種交易類型都是基本交易類型的擴展。

不同的交易類型處理方式不同。

有沒有一種方法在PHP中獲取每個交易的交易類型作爲迴應 (其他然後試圖找出每個複雜類型內的元素差異)?

有很多的類型和很多每種類型的元素....

是否有可能得到這個任何一類?

下面只是說明...

<transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type1"> 
    <id>24111</id><something>00000000</something><name>Blah</name> 
</transactions> 
<transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type8"> 
    <id>24111</id><somethingelse>011</somethingelse> 
</transactions> 
+0

除非你沒有發佈具體的代碼,否則你的問題不是很具體。在它的廣泛形式中,我的答案是:*「最有可能的是,PHP中有一種方法」*。如果您共享您正在使用的SOAP客戶端庫,那麼告訴你甚至更簡單。只是說,因爲我看到你已經在你的問題上付出了相當多的獎金,這在技術上只能被猜測,沒有得到回答,所以你最有可能冒險浪費你的賞金。 – hakre

回答

2

我不是很確定,如果這樣的回答適合你的問題完全一樣。以下代碼片段通過它們的給定名稱空間獲取type屬性值,而不是命名空間值本身的類型。

用PHP自己的文檔對象模型完成。

<?php 
$str = <<<XML 
    <content> 
     <transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type1"> 
      <id>24111</id> 
      <something>00000000</something> 
      <name>Blah</name> 
     </transactions> 
     <transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type8"> 
      <id>24111</id> 
      <somethingelse>011</somethingelse> 
     </transactions> 
    </content> 
XML; 

$doc = new DomDocument(); 
$doc->loadXML($str); 

$nodeList = $doc->getElementsByTagName('transactions'); 
foreach ($nodeList as $element) { 
    $value = $element->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'type'); 
    echo $value . "\n"; 
} 

這將輸出兩種給定類型「ns2:type1」和「ns2:type8」。

1

我可以simple_html_dom分析你的元素。

Here是它的鏈接。

一個例子是在這裏:

<?php 
include "simple_html_dom.php"; 
$html_nb = ' 
<transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type1"><id>24111</id><something>00000000</something><name>Blah</name> 
</transactions> 
<transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type8"><id>24111</id><somethingelse>011</somethingelse> 
</transactions>'; 
function chtml($str){ 
    if(strpos("<html>", $str) !== false) 
     return '<html><whole_code>'.$str.'</whole_code></html>'; 
    else 
     return "<whole_code>".$str."</whole_code>"; 
} 
function find_element_type($str){ 
    if(preg_match_all("/\<(.*?)\>/i", $str, $matches)) 
     return $matches[1][0]; 
    else 
     return false; 
} 
function get_xsi_type($str){ 
    if(preg_match_all("/xsi\:type\=\"(.*?)\"/i", $str, $matches)) 
     return $matches[1][0]; 
    else 
     return false; 
} 

$html = new simple_html_dom(); 
$html_2 = new simple_html_dom(); 
$html->load(chtml($html_nb)); 
$max_type = 10; 

$element = $html->find('whole_code'); 
$e = $element[0]->innertext; 
$html_2->load(chtml($e)); 
$k = 0; 
while($html_2->find("whole_code",false)->children($k) != "") 
{ 
    $all = $html_2->find("whole_code",false)->children($k); 
    echo get_xsi_type($all) . "<br>"; 
    echo find_element_type($all) . " : " .$all."<br>"; 
    $k++; 
} 
echo "<hr>"; 

結果:

ns2:type1 
transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type1" : 2411100000000Blah 
ns2:type8 
transactions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:type8" : 24111011 
+0

不錯的解析,但與問題無關。我需要xsi:type ..... – Radmilo

+0

使用get_xsi_type函數進行了改進並進行了一些更改。檢查結果。用於simple_html_dom的 –

+0

-1僅用於檢索XML命名空間中的DOM節點。 PHP附帶的標準DOM庫已經這樣做了。 – hakre