我有以下剥离的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
答案 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