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代码:

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

4

1 回答 1

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>";
}

一切正常,我得到了请求 Name 'SendMailling'

于 2012-06-28T10:51:31.903 回答