gen*_*pos 0 php xml xpath simplexml
我需要 xml 节点的完整路径。我看到了这个问题
的答案,但我无法使用它。
下面是我在 php web 测试器上使用但没有成功的代码:
$xml = <<<EOF
<root>
<First>
<Martha>Text01</Martha>
<Lucy>Text02</Lucy>
<Bob>
<Jhon>Text03</Jhon>
</Bob>
<Frank>One</Frank>
<Jessy>Two</Jessy>
</First>
<Second>
<Mary>
<Jhon>Text04</Jhon>
<Frank>Text05</Frank>
<Jessy>Text06</Jessy>
</Mary>
</Second>
</root>
EOF;
$MyXml = new SimpleXMLElement($xml);
$Jhons = $MyXml->xpath('//Jhon');
foreach ($Jhons as $Jhon){
echo (string) $Jhon;
//No one of the following works
echo (string) $Jhon->xpath('./node()/path()');
echo (string) $Jhon->xpath('./path()');
echo (string) $Jhon->xpath('.path()');
echo (string) $Jhon->path();
echo '<br/> ';
}
Run Code Online (Sandbox Code Playgroud)
我需要:“/root/First/Bob/Jhon”和“/root/Second/Mary/Jhon”
您可以使用更强大的 DOM(基于 PHP 的 DOMDocument)api 来执行此操作...
$MyXml = new SimpleXMLElement($xml);
$Jhons = $MyXml->xpath('//Jhon');
foreach ($Jhons as $Jhon){
$dom = dom_import_simplexml($Jhon);
echo $dom->getNodePath().PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
转换dom_import_simplexml($Jhon)
节点然后getNodePath()
显示路径...
这给出了(例如)
/root/First/Bob/Jhon
/root/Second/Mary/Jhon
Run Code Online (Sandbox Code Playgroud)
或者,如果您只想坚持使用 SimpleXML,则可以使用 XPath 轴祖先或自我来列出当前节点和每个父节点...
$MyXml = new SimpleXMLElement($xml);
$Jhons = $MyXml->xpath('//Jhon');
foreach ($Jhons as $Jhon){
$parent = $Jhon->xpath("ancestor-or-self::*");
foreach ( $parent as $p ) {
echo "/".$p->getName();
}
echo PHP_EOL;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1991 次 |
最近记录: |