找到绝对路径的xpath有没有简单的方法? [英] xpath finding absolute path is there any easy way?

查看:149
本文介绍了找到绝对路径的xpath有没有简单的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图找到一种方法来为页面上的某个元素添加书签,以便稍后能够对其进行检查。我到目前为止所尝试的所有事情都会导致我遇到一些问题,所以我得出结论认为寻找绝对路径可能是唯一的方法。



我是新手xpath或DOMdocument在一般情况下,所以我可能命名错误,但通过绝对路径我的意思是类似的:


$ b

/ html / body / div [ 1] / div [1] / div [2] / span [2]



可以说我使用:

$ b'b

$ element_with_something = $ xpath-> query('(// * [text()=something])');



这给了我一个元素。现在我的问题是找到一条绝对路径的简单方法。如果不。那么我可能会递归我的方式上树。



如果是这样,我如何检查一个元素是否有父项?



我知道我可以使用 hasChildNodes()来查找孩子,但有没有办法找出是否存在家长 ?或任何其他方式来打破递归它的树顶部?

解决方案

您可能正在寻找 DOMNode :: getNodePath() 。一个简单的例子:

  $ xml =< < blaah1 name =whatever > 
<性别名称=男性>

< 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(),\\\
;


$ / code $ / pre
$ b $ p

  / 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]


I have tried to find a way to "bookmark" an element on a page so i will later on be able to check on it. everything I've tried so far lead me to some problem so I've came to the conclusion that finding the absolute path might be the only way.

I am new to xpath or DOMdocument in general so i might have the naming wrong however by absolute path i mean something like:

"/html/body/div[1]/div[1]/div[2]/span[2]"

lets say i use:

$element_with_something = $xpath->query('(//*[text()= "something"])');

This gave me an element. now my question is there an easy way of finding it's absolute path. if not. then i will probably have to recursion my way up the tree.

if so how can i check if an element has a parent?

I know i can use hasChildNodes() to find child but is there a way to find out if there is a parent ? or any other way to break the recursion ones it hit the top of the tree ?

解决方案

You might be looking for DOMNode::getNodePath(). A quick example:

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

}

And it's output:

/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]

这篇关于找到绝对路径的xpath有没有简单的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆