2010-07-21 2 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 в рамках каждого item_container. Смысл, я хочу делать определенные вещи с каждым item, зная, какие item_container они находятся под.

Вот код, чтобы получить в первом item_container:

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

Это все хорошо. Теперь, я предположил бы, что:

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

вернется только первые два пункта, два под первой item_container. Однако он возвращает все четыре элемента, которые я не понимаю.

Как я могу получить доступ к первым двум предметам?

ответ

1

XPath, начинающийся с 2 косой черты, выбирает узлы с этим именем независимо от их положения в документе. Именно поэтому вы можете выбрать свой фундамент с //foundation несмотря на то, начиная с корня XML он содержится в <products>

Выбрав первый item_container, ic как в вопросе вы можете выбрать 2 пунктов под ним с ic.xpath('item')

например

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

wow - должен был рассмотреть синтаксис xpath, подумал, что требуется 2 слэша, видимо, нет. спасибо Майк! – 46and2

Смежные вопросы