如何解析SOAP以列出所有请求和对象名称

时间:2012-06-28 10:03:33

标签: php soap xpath namespaces simplexml

当我知道命名空间和请求名称时,我能够解析XML SOAP。

因为我有不同类型的SOAP请求,所以我想在SOAP文件中获取Request名称。提取我的一部分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代码:

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')但......

1 个答案:

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

您可能希望限制此操作,因为您只希望非<SOAP-ENV:Body>的直接子项使用SOAP-ENV前缀注册该命名空间并扩展前一个xpath:

/SOAP-ENV:Body/ns1:*

这应该包含您正在寻找的所有元素。


(OP :)再次感谢,当我做

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

一切正常我收到名为'SendMailling'的请求。