проблема с, казалось бы, простым анализом XML - PullRequest
1 голос
/ 22 июля 2010

У меня есть 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>

Я использую Нокогири для разбора. То, что я хочу сделать, это работать с каждым 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 Ответ

1 голос
/ 22 июля 2010

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>
...