如果我有一个Nokogiri::XML::元素,我如何计算它的子索引相对于它的父索引?即:
<foo> <-- parent
<bar/> <-- 1st child
<bar/> <-- 2nd child
</foo>
在Javascriptland中,jQuery有index(),但是Nokogiri没有。Nokogiri确实提供了一个路径方法,但它返回一个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
如何:
element.parent.children.index(element)
只考虑非文本节点:
element.xpath('../*').index(element)
只考虑条形节点:
element.xpath('../bar').index(element)
技巧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明显更快。
选择具有相同元素名称的节点并返回索引:
element.parent.xpath(element.name).index(element)