Я попытался найти способ «закладок» элемента на странице, чтобы потом проверить его. все, что я пробовал до сих пор, привело меня к какой-то проблеме, поэтому я пришел к выводу, что найти абсолютный путь может быть единственным способом.
Я новичок в xpath или DOMdocument вообще, поэтому у меня может быть неправильное имя, но по абсолютному пути я имею в виду что-то вроде:
"/html/body/div[1]/div[1]/div[2]/span[2]"
скажем, я использую:
$element_with_something = $xpath->query('(//*[text()= "something"])');
Это дало мне элемент. теперь мой вопрос – это простой способ найти абсолютный путь. если не. то мне, вероятно, придется рекурсивно пройтись по дереву.
если да, то как я могу проверить, имеет ли элемент родительский элемент?
Я знаю, что могу использовать hasChildNodes()
чтобы найти ребенка, но есть ли способ узнать, есть ли родитель? или любой другой способ разбить рекурсию, он попал в вершину дерева?
Возможно, вы ищете DOMNode::getNodePath()
. Быстрый пример:
$xml = <<<XML <blaah1 name="whatever"> <gender name="male"> <example1 baseurl="male/86644/"> <xu="lol.png"/> <xu="haha.png"/> <xu="name.png"/> </example1> <example2 baseurl="male/27827/"> <xu="page.png"/> <xu="examp.png"/> <xu="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]