确定Nokogiri元素的子索引

时间:2011-12-05 05:32:49

标签: ruby xml nokogiri parent-child

如果我有一个Nokogiri :: XML :: Element,我如何计算其父索引的子索引?那就是:

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

在Javascriptland中,jQuery有index(),但Nokogiri没有。 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 个答案:

答案 0 :(得分:7)

怎么样:

element.parent.children.index(element)

仅考虑非文本节点:

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

仅考虑条形节点:

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

答案 1 :(得分:3)

技巧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的速度要快得多。

答案 2 :(得分:1)

这将选择具有相同元素名称的节点并返回索引:

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