我试图找到一种方法来记录"书签"页面上的元素,以便稍后我可以检查它。到目前为止,我所尝试的一切都让我遇到了一些问题,所以我得出的结论是找到绝对路径可能是唯一的方法。
我是xpath或DOMdocument的新手,所以我的命名可能不对,但绝对路径我的意思是:
"/html/body/div[1]/div[1]/div[2]/span[2]"
让我说使用:
$element_with_something = $xpath->query('(//*[text()= "something"])');
这给了我一个元素。现在我的问题是有一种简单的方法来找到它的绝对路径。如果不。然后我可能不得不在树上递归。
如果是这样,我如何检查元素是否有父元素?
我知道我可以使用hasChildNodes()
找到孩子,但有没有办法找出是否有父母?或任何其他方式来打破它击中树顶的递归?
答案 0 :(得分:2)
您可能正在寻找DOMNode::getNodePath()
。一个简单的例子:
$xml = <<<XML
<blaah1 name="whatever">
<gender name="male">
<example1 baseurl="male/86644/">
<x u="lol.png"/>
<x u="haha.png"/>
<x u="name.png"/>
</example1>
<example2 baseurl="male/27827/">
<x u="page.png"/>
<x u="examp.png"/>
<x u="bottom.png"/>
</example2>
</gender>
</blaah1>
XML;
$doc = new DOMDocument();
$doc->loadXML($xml);
$xp = new DOMXPath($doc);
foreach($xp->query('//node()') as $node ) {
echo $node->getNodePath(), "\n";
}
它的输出:
/blaah1
/blaah1/text()[1]
/blaah1/gender
/blaah1/gender/text()[1]
/blaah1/gender/example1
/blaah1/gender/example1/text()[1]
/blaah1/gender/example1/x[1]
/blaah1/gender/example1/text()[2]
/blaah1/gender/example1/x[2]
/blaah1/gender/example1/text()[3]
/blaah1/gender/example1/x[3]
/blaah1/gender/example1/text()[4]
/blaah1/gender/text()[2]
/blaah1/gender/example2
/blaah1/gender/example2/text()[1]
/blaah1/gender/example2/x[1]
/blaah1/gender/example2/text()[2]
/blaah1/gender/example2/x[2]
/blaah1/gender/example2/text()[3]
/blaah1/gender/example2/x[3]
/blaah1/gender/example2/text()[4]
/blaah1/gender/text()[3]
/blaah1/text()[2]