从服务器响应获取soap xsi:type

时间:2013-09-26 13:38:05

标签: php soap response complextype

我从SOAP服务器得到响应,每个响应中都有零个或多个不同类型的事务。

每种交易类型都是基本交易类型的扩展。

不同的交易类型处理方式不同。

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>

2 个答案:

答案 0 :(得分: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 :(得分: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