PHP获取DOMNode的XPath

时间:2010-04-15 07:51:12

标签: php xml dom xpath

我正在动态创建XML文档。我需要知道我刚刚创建的Node的XPath。 我没有看到像DOMNode::calculateXPath(void):string这样的功能 而且我不愿意自己写一篇。是否有任何已知的lite第三方解决方案??

3 个答案:

答案 0 :(得分:3)

前一段时间有一个类似的问题,我在其中发布了一些内容:

function calculateXPath(DOMNode $node)
{
    $q     = new DOMXPath($node->ownerDocument);
    $xpath = '';

    do
    {
        $position = 1 + $q->query('preceding-sibling::*[name()="' . $node->nodeName . '"]', $node)->length;
        $xpath    = '/' . $node->nodeName . '[' . $position . ']' . $xpath;
        $node     = $node->parentNode;
    }
    while (!$node instanceof DOMDocument);

    return $xpath;
}

正如Tomasz所提到的,它绝对不像使用id那样强大或面向未来。

答案 1 :(得分:2)

给定节点没有明确的XPath,因为XPath是一个搜索查询。与谷歌一样,您可以使用不同的搜索字词查找特定页面。更重要的是,当您修改DOM树时,返回当前节点的XPath查询可能(可能会)更改,因此您可以获得的路径仅在下一次树修改完成之前有效。

您可以为每个节点提供唯一的ID或类名(当您想要使用其他ID时,类更安全 - 可以有多个类,只有一个ID)。然后你可以使用这个类/ id进行搜索。

标记范围和类unique_1 _:

的示例
//span[contains(@class, 'unique_1_')]

答案 2 :(得分:2)

我知道这有点老了,但我想补充一下以防其他人正在寻找这个。

从PHP 5.2开始,DomNode::getNodePath()扩展了DomElement

请参阅:http://www.php.net/manual/en/domnode.getnodepath.php