php xpath - 获取节点位置

时间:2009-05-02 14:35:16

标签: php

我有以下剥离的PHP代码...

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生成。

所以结果将是= 0 |,1 | 0,2 | 1,3 | 1,4 | 1,5 | 0,6 | 5,7 | 6

4 个答案:

答案 0 :(得分: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代码中读取该属性。

答案 1 :(得分:1)

我不相信你能在dom中找到位置(读取xpath),除非你自己做一些花哨的编码。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

在PHP中处理XML的最简单方法是使用SimpleXML类并使用Children属性循环。见http://nl2.php.net/manual/en/function.simplexml-element-children.php