唯一标识DOM节点的最佳方法是什么?

时间:2010-01-15 12:09:00

标签: html dom xpath

什么是唯一标识HTML文档中所有DOM节点的方法。为了说明我的意思,这是一个(虚构的)例子:

  • 脚本X从document.html中随机选择一个DOM节点。
  • 脚本X需要告诉脚本Y它选择了哪个DOM节点。
  • 脚本X如何唯一地标识它所选择的DOM节点,以便脚本Y确切地知道它在document.html中的哪个节点?

我真的对如何唯一地识别DOM节点感兴趣,以便脚本Y可以识别它并操纵它。优选地,它也应该与文本节点一起工作。我可能正在考虑使用XPath,但我不确定如何为任何给定节点生成唯一 XPath。

4 个答案:

答案 0 :(得分:6)

您应该能够通过从节点向后工作向后工作来确定一个唯一的XPath,并跟踪您所在的节点以及它的兄弟节点,这样您就可以得到类似的内容:

/a[1]/b[2]/c[101]/text()

这是第二个C节点下的第101个B节点等。因此,这是一个唯一路径,可以参考原始文档复制

答案 1 :(得分:1)

您可能需要查看XPathGen https://github.com/amouat/XPathGen

它将为给定的DOM节点创建/node()[1]/node()[1]形式的唯一XPath。但是,XPath存在一些问题,即非合并文本节点和“prolog”节点,这些节点不能仅使用XPath进行唯一标识。例如,如果您在DOM中有以下文档:

<a>b</a>

添加一个文本节点成为:

<a>bc</a>

节点b和c的XPath将是相同的,但您仍将拥有单独的DOM节点(除非您在文档上调用normalize)。如果需要处理这种情况,则需要存储文本节点的偏移量和长度。

答案 2 :(得分:0)

嗯,导致单个节点的XPath表达式应该是唯一的。 “如何为任何给定节点生成唯一的XPath”是什么意思?

答案 3 :(得分:0)

沿XPath轴的序数子位置。节点排序很强,所以说:

小孩5的小孩4的小孩3的孩子1。

应该这样做。