在XML中查找标记名[PHP]
我有来自SOAP的XML,它看起来像:在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
<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)