如果我有一个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
答案 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)