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

Posted

技术标签:

【中文标题】唯一标识 DOM 节点的最佳方法是啥?【英文标题】:What is the best way to uniquely identify a DOM node?唯一标识 DOM 节点的最佳方法是什么? 【发布时间】:2011-01-05 11:46:52 【问题描述】:

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

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

我对如何唯一标识 DOM 节点非常感兴趣,以便脚本 Y 可以识别并操作它。最好,它也应该与文本节点一起使用。我可能在考虑 XPath,但我不确定如何为任何给定节点生成 unique XPath。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

Xpath 实现在大多数语言中都可用。在命令行上,您可以使用名为 xmlstarlet 的命令行工具(只需 Google 即可) 正是我想要的!如果我的代码如下所示:

hello dear world

。我如何识别“世界”节点。我会做这样的事情吗? /div[0]/p[0]/text[1] ?
是的。但是 Xpath 是从 1 开始的,而不是从 0 开始的 注意非合并的文本节点,它不能完全用 XPath 来识别。【参考方案2】:

您可能想看看 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)。如果您需要处理这种情况,您将需要存储文本节点的偏移量和长度。

【讨论】:

【参考方案3】:

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

【讨论】:

对,但我正在反过来做:我知道我在哪个节点,但不知道如何到达那里;)布赖恩的回答似乎足够好。【参考方案4】:

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

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

应该这样做。

【讨论】:

以上是关于唯一标识 DOM 节点的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ObjectId 作为 mongo 中用户的唯一标识符的替代方法是啥?

使用带有 Linq to Sql 的 Sql Server 唯一标识符/更新日期列 - 最佳方法

能够唯一标识某一控件的属性的是啥

React组件渲染

关于安卓唯一标识的汇总及最佳做法

HSQLDB 的 MS SQL“唯一标识符”数据类型的替代方案是啥?