2010-07-21 96 views
1

我有一個XML文件: 問題用一個看似簡單的XML解析

<products> 
    <foundation label="New Construction"> 

     <series label="Portrait Series" startImg="img/blank.png"> 
      <item_container nr="1" label="Firebed"> 
       <item next="11" id="" label="Logs Black Brick">img/PortraitSeries/logs-black-brick.png</item> 
       <item next="12" id="" label="Logs Red Brick">img/PortraitSeries/logs-red-brick.png</item> 
      </item_container> 

      <item_container nr="2" label="Fronts"> 

      <item next="21" id="569LFP" label="Ledge Front - Patina">img/New_PortraitSeries/patina_front.png</item> 
      <item next="22" id="569LFB" label="Ledge Front - Black">img/New_PortraitSeries/black_front.png</item> 
      </item_container> 
     </series> 

    </foundation> 

</products> 
</meh> 

我使用引入nokogiri解析。我想要做的是在每個item_container範圍內的每個item元素上進行操作。意思是,我想在知道哪個item_container下的時候對每個item做某些事情。

下面是一些代碼來獲得在第一item_container:

foundation = @doc.at_xpath("//foundation") 
ic = foundation.children.xpath("//series").children.xpath("//item_container")[0] 

這一切都很好。現在,我會認爲:

ic.children.xpath("//item") 

將只返回前兩個項目,這兩個下的第一個item_container。但是,它返回了我不瞭解的所有四個項目。

如何才能訪問前兩項?

回答

1

以2個斜線開頭的XPath會選擇具有該名稱的節點,而不管它們在文檔中的位置。這就是爲什麼你可以儘管從它被包含在<products>

的XML的根開始在選擇了第一item_container,與//foundation選擇你的基礎ic作爲問題,你可以選擇其下的2項ic.xpath('item')

eg

irb(main):120:0> items = ic.xpath('item') 
=> [#<Nokogiri::XML::Element:0x15b030a name="item" attributes=[#<Nokogiri::XML:: 
Attr:0x15b0260 name="next" value="11">, #<Nokogiri::XML::Attr:0x15b0256 name="id 
... 
irb(main):121:0> items.size 
=> 2 
irb(main):122:0> items[0].attribute('label').value 
=> "Logs Black Brick" 
irb(main):123:0> items[1].attribute('label').value 
=> "Logs Red Brick" 
irb(main):124:0> 
+0

哇 - 應該查看xpath語法,認爲需要2個斜線,顯然不是。 謝謝邁克! – 46and2 2010-07-22 00:17:31