当我知道命名空间和请求名称时,我能够解析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')
但......
答案 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'
的请求。