2011-12-05 47 views
2

如果我有一個Nokogiri :: XML :: Element,我如何計算它的子索引相對於它的父類?那就是:確定一個Nokogiri元素的子索引

<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 

回答

6

如何:

element.parent.children.index(element) 

只考慮非文本節點:

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

只考慮吧節點:

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

注意,這將在列表中包含文本節點。 – Phrogz

+0

美麗! @Phrogz,指出,但這是平凡的使用element_children而不是(如在你的答案)。 – jpatokal

+0

@jpatokal Yup;儘管不正確,我仍然維持他的答案。 – Phrogz

2

技巧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

這將選擇相同的元素名稱的節點並返回索引:

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

相關問題