2009-05-02 118 views
0

我有以下的剥离下来的PHP代码...PHP的XPath - 获取节点位置

foreach ($xpath->query('/html/body//a')} as $queryitem) { 
    $nodeposition = ???; 
    $parentposition = ???; 
} 

...从这个是有可能找到每个节点的位置和位置其父?

例如:

0..<html>
1....<head>
2......<title>
3......<meta>
4......<meta>
5....<body>
6......<div>
7........<a>

这会为每个标记生成一种ID,并为其加入的父标记的ID生成一个ID。

那么结果会= 0 | 1 | 0.2 | 1,3 | 1,4 | 1.5 | 0.6 | 5.7 | 6

+0

您的位置是什么意思?节点在树中的位置? – Gumbo 2009-05-02 14:47:52

回答

1

我不相信你将能够在dom中获得位置(读取xpath),除非您自己编写一些奇特的编码。

1

您需要了解完整的DOM树才能解决此问题。但是对于XPath,您只需获得与路径匹配的特定子树。您需要逐个走树并检索与XPath匹配的每个元素的信息。但这可能是低效的。如果从根节点向下走树并计算节点数,可能会更好。

2

如果“位置”你的意思是在先节点(如你似乎你的样品中暗示)的数量,那么这将工作(可能不是一流的效率,但仍然):

foreach ($xpath->query('/html/body//a') as $queryitem) { 
    $nodeposition = count($xpath->query('preceding::*', $queryitem)); 

    $parent = $xpath->query('parent::*', $queryitem); 
    if ($parent->length == 1) 
    $parentposition = count($xpath->query('preceding::*', $parent->item(0))); 
    else 
    $parentposition = -1; // or whatever 
} 

未经测试,但您明白了。

另一种方法是对XSLT标识转换进行编码,该转换将位置添加到文档中的所有节点作为属性。然后你可以阅读你的PHP代码中的属性。