Определение дочернего индекса элемента Nokogiri - PullRequest
3 голосов
/ 05 декабря 2011

если у меня есть Nokogiri :: XML :: Element, как мне определить его дочерний индекс по отношению к его родителю? То есть:

<foo>     <-- parent
  <bar/>  <-- 1st child
  <bar/>  <-- 2nd child
</foo>

В Javascriptland jQuery имеет index () , но у Нокогири нет. Nokogiri предоставляет метод path , но он возвращает строку XPath, такую ​​как "/foo/bar[2]", и усекает bar[1] до bar для загрузки, поэтому превращение этого числа в число немного затруднительно:

element.path.split('/').last.slice(/[0-9]+/) || '1'          # quick'n'dirty
element.path.split('/').last.slice(/\[([0-9]+)\]/, 1) || '1' # a bit safer

Ответы [ 3 ]

7 голосов
/ 05 декабря 2011

Как насчет:

element.parent.children.index(element)

Для рассмотрения только нетекстовых узлов:

element.xpath('../*').index(element)

Для рассмотрения только узлов стержней:

element.xpath('../bar').index(element)
3 голосов
/ 06 декабря 2011

Техника 1: найдите моих братьев и сестер, посмотрите, где я в них поместился:

idx = element.parent.element_children.index(element)

# Alternatively:
idx = element.parent.xpath('*').index(element)

Техника 2: Подсчитать количество узлов элемента (не текста) передо мной:

idx = element.xpath('count(preceding-sibling::*)').to_i

# Alternatively, if you want to waste time and memory:
# idx = element.xpath('preceding-sibling::*').length

Техника 2 заметно быстрее.

1 голос
/ 16 июля 2013

Выбирает узлы с одинаковым именем элемента и возвращает индекс:

element.parent.xpath(element.name).index(element)

...