2010-01-15 87 views
8

什么是唯一标识HTML文档中所有DOM节点的方法。为了说明我的意思,下面是一个(虚构的)示例:什么是唯一标识DOM节点的最佳方式?

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

我真的很感兴趣,如何唯一标识DOM节点,以便脚本Y可以识别它并操纵它。优选地,它也应该与文本节点一起工作。也许我在想XPath,但是我不确定如何为任何给定的节点生成一个唯一的 XPath。

回答

6

您应该能够通过从节点向后工作根节点,并跟踪您的节点,以确定一个独特的XPath和其兄弟是,这样你得到的东西,如:

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

所以这是第二B节点下的第101 C节点等。因此,这是一个独特的路径并且可以沿着XPath轴参照围绕复制到原始文档

+0

如果有脚本Z操纵DOM也会如何? – tback 2010-01-15 12:21:19

+0

Xpath实现在大多数语言中都可用。在命令行上,你可以使用一个名为xmlstarlet的命令行工具(只是谷歌为它) – 2010-01-15 12:22:40

+0

正是我在找什么!如果我的代码如下所示:

hello dear world

。我如何识别“世界”节点。我会做这样的事吗?/div [0]/p [0]/text [1]? – 2010-01-15 12:26:58

0

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

+0

对,但我正在做相反的事情:我知道我在哪个节点,但不知道如何到达那里;)Brian的回答似乎不错。 – 2010-01-15 12:19:31

0

序孩子的位置。节点强有序,所以说:孩子5

儿童4儿童3

孩子1应该这样做。

1

你可能想看看XPathGen https://github.com/amouat/XPathGen

它将创建形式/node()[1]/node()[1]独特的XPath对于给定的DOM节点。但是,XPath存在一些问题,即非合并文本节点和“序言”节点,这些节点不能用纯粹的XPath唯一标识。例如,如果你有下列文件中的DOM:

<a>b</a> 

,并添加一个文本节点变为:

<a>bc</a> 

的XPath来节点B和C是相同的,但你仍然有单独的DOM节点(除非您在文档上调用标准化)。如果您需要处理这种情况,则需要为文本节点存储偏移量和长度。

相关问题