2011-12-05 17 views
2

Nokogiri :: XML :: Elementがある場合、その親インデックスと子インデックスをどのようにして計算しますか?つまり:JavascriptlandでNokogiri要素の子インデックスを調べる

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

、jQueryのはindex()を持っていますが、鋸山はしていません。鋸山はpath方法を提供し、それはので、バックナンバーに回す少し毛深いです、"/foo/bar[2]"のようなXPath文字列を返し、ブートする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はい。私は間違っているにもかかわらず、まだ彼の答えをupvoted。 – 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)

関連する問題