我有一个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
下面。但是,它会返回我不理解的所有四个项目。
如何才能访问前两项?
答案 0 :(得分:1)
以2斜杠开头的XPath选择具有该名称的节点,而不管它们在文档中的位置如何。这就是为什么你可以用//foundation
选择你的基础,即使从<products>
在问题中选择了第一个item_container
,ic
后,您可以使用ic.xpath('item')
e.g。
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>