Php DOMXPath路径显示为星号
我有一个XML字符串,代码段如下:Php DOMXPath路径显示为星号,php,xml,simplexml,domdocument,domxpath,Php,Xml,Simplexml,Domdocument,Domxpath,我有一个XML字符串,代码段如下: <?xml version="1.0"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body>
<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SendPurchases xmlns="urn:services.insurance">
<Partner>
<UserID>MyCompany</UserID>
<Password>ABC123</Password>
</Partner>
<PurchasesRequest>
<Total>100</Total>
</PurchasesRequest>
</SendPurchases>
</soap:Body>
</soap:Envelope>
然后,我希望操纵某些值,最好使用它们的路径:
$elements = $xpath->query('/soap:Envelope/soap:Body/SendPurchases/Partner/UserID');
但是,上面的查询没有返回任何结果
事实上,当我遍历文档中的所有元素时:
foreach ($doc->getElementsByTagName('*') as $node) {
echo $node->getNodePath() . "\n";
}
它返回如下内容:
/soap:Envelope/soap:Body
/soap:Envelope/soap:Body/*
/soap:Envelope/soap:Body/*/*[1]
/soap:Envelope/soap:Body/*/*[1]/*[1]
/soap:Envelope/soap:Body/*/*[1]/*[2]
/soap:Envelope/soap:Body/*/*[2]
/soap:Envelope/soap:Body/*/*[2]/*[1]
正如您所看到的,
中的所有元素都替换为星号和索引,而不是元素名称
沿着该路径进行查询是可行的,但对我来说维护起来并不容易,我更愿意使用元素名。感谢@Dekel的提示。我需要注册这两个名称空间,然后在查询时指定名称空间:
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$xpath->registerNamespace('insr', 'urn:services.insurance');
$elements = $xpath->query('/soap:Envelope/soap:Body/insr:SendPurchases/insr:Partner/insr:UserID');
现在它正在工作。另一个选项是:
$xml='1!'
我的公司
ABC123
100
';
$doc=新的DOMDocument();
$doc->loadXML($xml);
$xpath=新的DOMXPath($doc);
$elements=$xpath->query(“/*[local-name()='UserID']”);
变量转储($elements->item(0)->nodeValue);
//字符串(9)“MyCompany”
您的内部元素不包含外部名称空间,因此无法直接从外部树访问它们。@Dekel感谢您的提示,让我找到了正确的方向
$xpath = new DOMXPath($doc);
$xpath->registerNamespace('soap', 'http://schemas.xmlsoap.org/soap/envelope/');
$xpath->registerNamespace('insr', 'urn:services.insurance');
$elements = $xpath->query('/soap:Envelope/soap:Body/insr:SendPurchases/insr:Partner/insr:UserID');
$xml = '<?xml version="1.0"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<SendPurchases xmlns="urn:services.insurance">
<Partner>
<UserID>MyCompany</UserID>
<Password>ABC123</Password>
</Partner>
<PurchasesRequest>
<Total>100</Total>
</PurchasesRequest>
</SendPurchases>
</soap:Body>
</soap:Envelope>';
$doc = new DOMDocument();
$doc->loadXML($xml);
$xpath = new DOMXPath($doc);
$elements = $xpath->query("//*[local-name()='UserID']");
var_dump($elements->item(0)->nodeValue);
// string(9) "MyCompany"