2010-01-22 44 views

回答

1

節點#子是獲取第一個子元素的最快方法。然而,如果你正在尋找的節點不是第一個(例如第99個),那麼沒有比選擇該節點更快的方式來調用#children和索引。

如果您只需要第一個孩子,那麼爲所有孩子構建NodeSet是昂貴的。

一個限制因素是libxml2(基礎Nokogiri的XML庫)將節點的子節點存儲爲鏈接列表。所以你需要遍歷列表(O(n))來選擇所需的子節點。

編寫一個方法來簡單地返回第n個孩子,而不實例化所有其他孩子的NodeSet或Ruby對象是可行的。我的建議是打開功能請求,在http://github.com/tenderlove/nokogiri/issues或發送電子郵件到nokogiri郵件列表。

+0

它已經完成!謝謝:-) http://github.com/tenderlove/nokogiri/issues#issue/211 – Steinbitglis 2010-01-24 11:44:21

2

您可以自己嘗試並基準結果。

我創建了一個快速基準:http://gist.github.com/283825

$ ruby test.rb 
Rehearsal --------------------------------------------------- 
xpath/first()  3.290000 0.030000 3.320000 ( 3.321197) 
xpath.first  3.360000 0.010000 3.370000 ( 3.381171) 
at    4.540000 0.020000 4.560000 ( 4.564249) 
at_xpath   3.420000 0.010000 3.430000 ( 3.430933) 
children.second 0.220000 0.010000 0.230000 ( 0.233090) 
----------------------------------------- total: 14.910000sec 

         user  system  total  real 
xpath/first()  3.280000 0.000000 3.280000 ( 3.288647) 
xpath.first  3.350000 0.020000 3.370000 ( 3.374778) 
at    4.530000 0.040000 4.570000 ( 4.580512) 
at_xpath   3.410000 0.010000 3.420000 ( 3.421551) 
children.second 0.220000 0.010000 0.230000 ( 0.226846) 

從我的測試中,children似乎是最快的方法。

+0

您所使用的四種第一種方法使用xpath,這非常緩慢。 正如問題中提到的那樣,子方法分析整個父節點,這也是不可接受的。 嘗試使用100倍的節點和1/100的許多測試。 – Steinbitglis 2010-01-22 16:46:39

+0

感謝您向我展示基準庫......我認爲它可能在未來有用:-) – Steinbitglis 2010-01-22 16:48:08

0

,無論是使用XPath也導致解析整個母公司的一個方法是使用這兩個節點#子(),節點#NEXT_SIBLING()和節點#元素?()

這樣的事情...

def first(node) 
    element = node.child 
    while element 
     if element.element? 
      return element 
     else 
      element = element.next 
     end 
    end 
    nil 
end 
相關問題