Каков наилучший способ уникальной идентификации узла DOM? - PullRequest
8 голосов
/ 15 января 2010

Какой способ уникальной идентификации всех узлов DOM в документе HTML. Чтобы проиллюстрировать, что я имею в виду, вот (вымышленный) пример:

  • Скрипт X случайным образом выбирает DOM-узел из document.html.
  • Скрипт X должен сообщить скрипту Y, какой узел DOM он выбрал.
  • Как скрипт X однозначно идентифицирует выбранный DOM-узел, чтобы скрипт Y точно знал, какой это узел в document.html?

Меня действительно интересует, как уникальным образом идентифицировать узел DOM, чтобы скрипт Y мог его идентифицировать и манипулировать им. Предпочтительно, он должен работать и с текстовыми узлами. Возможно, я думал о XPath, но я не уверен, как сгенерировать уникальный XPath для любого данного узла.

Ответы [ 4 ]

6 голосов
/ 15 января 2010

Вы должны быть в состоянии определить уникальный XPath, работая в обратном направлении от узла к корневому узлу, и отслеживая, на каком узле вы находитесь и какой у него брат, так что вы получите что-то вроде:

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

, так что это 101-й C узел под вторым B узлом и т. Д. Таким образом, это уникальный путь и может быть скопирован со ссылкой на исходный документ

1 голос
/ 06 января 2012

Возможно, вы захотите взглянуть на XPathGen https://github.com/amouat/XPathGen

Это создаст уникальный XPath в форме /node()[1]/node()[1] для данного узла DOM. Однако есть некоторые проблемы с XPath, а именно не слитые текстовые узлы и узлы «пролога», которые нельзя однозначно идентифицировать чисто с XPath. Например, если у вас есть следующий документ в DOM:

<a>b</a>

И добавьте текстовый узел, чтобы он стал:

<a>bc</a>

XPath для узлов b и c будет одинаковым, но у вас все равно будут отдельные узлы DOM (если только вы не вызовете normalize в документе). Если вам нужно справиться с этой ситуацией, вам необходимо сохранить смещения и длины для текстовых узлов.

0 голосов
/ 15 января 2010

Порядковые дочерние позиции вдоль осей XPath. Узлы строго упорядочены, и так сказать:

ребенок 1 ребенок 3 ребенок 4 ребенок 5 *. 1003 *

должен это сделать.

0 голосов
/ 15 января 2010

Хорошо, выражение XPath, которое приводит к одному узлу, должно быть уникальным. Что вы подразумеваете под «как сгенерировать уникальный XPath для любого данного узла»?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...