看似简单的XML解析问题

时间:2010-07-21 23:18:01

标签: ruby xml parsing nokogiri

我有一个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 个答案:

答案 0 :(得分:1)

以2斜杠开头的XPath选择具有该名称的节点,而不管它们在文档中的位置如何。这就是为什么你可以用//foundation选择你的基础,即使从<products>

中包含的XML的根开始

在问题中选择了第一个item_containeric后,您可以使用ic.xpath('item')

选择其下的2个项目

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>