在XML中查找标记名[PHP]

在XML中查找标记名[PHP],php,xml,Php,Xml,我有来自SOAP的XML,它看起来像: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://ws.axnbusiness.b2b.audatex.com" xmlns:typ="http://ws.axnbusiness.b2b.audatex.com/types"> <soapenv:Header/> <soap

我有来自SOAP的XML,它看起来像:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ws="http://ws.axnbusiness.b2b.audatex.com" 
xmlns:typ="http://ws.axnbusiness.b2b.audatex.com/types"> 
   <soapenv:Header/> 
   <soapenv:Body> 
      <ws:uploadTask> 
         <ws:parameters> 
            <item> 
               <key>loginId</key> 
               <value>sales@audatex.cz</value> 
            </item> 
            <item> 
               <key>password</key> 
               <value>Sales123</value> 
            </item> 
         </ws:parameters> 
但是如果没有成功,有没有人能帮我得到这样的东西?
谢谢。

一般来说,您应该使用。Soap是一种XML格式,可以使用XML解析器进行解析,但是使用特定的扩展和对象更容易

如果您试图用DOM解析它,您需要理解名称空间

您的电话是:

$doc->getElementsByTagNameNS('ws:uploadTask', '*');
这是获取具有命名空间的元素节点的正确方法。但是
ws:uploadTask
是一个节点名,包含名称空间前缀。实际名称空间是
xmlns:ws
属性的值。该属性为命名空间定义别名
ws
。XML解析器再次在内部将其解析为名称空间URI。您可以将
ws:uploadTask
as
{http://ws.axnbusiness.b2b.audatex.com}:上传任务
。因此,要在您调用的名称空间中获取具有本地名称
uploadTask
的元素:

$doc->getElementsByTagNameNS('http://ws.axnbusiness.b2b.audatex.com', 'uploadTask');
但是,这里有一种更容易从DOM获取数据的方法—使用
DOMXpath
对象。Xpath表达式可以从DOM文档中获取节点和标量值

$document = new DOMDocument();
$document->loadXml($soapXml);
$xpath = new DOMXpath($document);
$xpath->registerNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$xpath->registerNamespace('ws', 'http://ws.axnbusiness.b2b.audatex.com');

var_dump(
  $xpath->evaluate('count(/soap:Envelope/soap:Body/ws:uploadTask) > 0')
);
输出:

bool(true)
DOMXpath::registerNamespace()
为表达式注册命名空间别名。可以是与文档中相同的别名/前缀,也可以是不同的别名/前缀

Xpath表达式 获取
uploadTask
节点

/soap:Envelope/soap:Body/ws:uploadTask

。。。数一数

count(/soap:Envelope/soap:Body/ws:uploadTask)

。。。验证计数是否大于零


count(/soap:Envelope/soap:Body/ws:uploadTask)>0

您好,我已经有一段时间没有使用XML了,但是如果您使用DOMDocument进行XML解析,请尝试搜索不带命名空间(ws:)的元素。DOmDocument中的名称空间有时工作起来非常奇怪。如果您的节点名称将发生更改,您不应该依赖于名称,请使用
$doc->childNodes
,然后对它们进行访问。谢谢您,这是一个非常好的解释:)
bool(true)