在 Php / SimpleXml 中获取 xml 节点完整路径

Get xml node full path in Php / SimpleXml

提问人:genespos 提问时间:1/31/2018 最后编辑:genespos 更新时间:1/31/2018 访问量:1907

问:

我需要 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/> ';
}

我需要:“/root/First/Bob/Jhon”和“/root/Second/Mary/Jhon”

php xml xpath simplexml

评论

0赞 RomanPerekhrest 1/31/2018
POS预期结果

答:

5赞 Nigel Ren 1/31/2018 #1

您可以使用更强大的 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;
}

转换节点,然后显示路径...dom_import_simplexml($Jhon)getNodePath()

这给出了( 示例)

/root/First/Bob/Jhon
/root/Second/Mary/Jhon

或者,如果您只想坚持使用 SimpleXML,则可以使用 XPath 轴 ancestor-or-self 列出当前节点和每个父节点...

$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;
}