Сопоставление первого набора элементов с xpath

У меня есть XML-документ, который выглядит так.

<foo>
    <bar type="artist"/> Bob Marley </bar>
    <bar type="artist"/> Peter Tosh </bar>
    <bar type="artist"/> Marlon Wayans </bar>
</foo>
<foo>
    <bar type="artist"/> Bob Marley </bar>
    <bar type="artist"/> Peter Tosh </bar>
    <bar type="artist"/> Marlon Wayans </bar>
</foo>
<foo>
    <bar type="artist"/> Bob Marley </bar>
    <bar type="artist"/> Peter Tosh </bar>
    <bar type="artist"/> Marlon Wayans </bar>
</foo>

Я хотел бы построить xpath, который возвращает только первый набор:

<bar type="artist"/> Bob Marley </a>
<bar type="artist"/> Peter Tosh </a>
<bar type="artist"/> Marlon Wayans </a>

Как бы это сделать? Я пробовал //bar[@type='artist'], но очевидно, что это нечто большее. Заранее спасибо.


person Rasputin Jones    schedule 26.03.2010    source источник
comment
Например, вы хотели закрыть теги ‹bar› с помощью ‹/a› или это была просто опечатка?   -  person Darth Continent    schedule 26.03.2010


Ответы (1)


Чтобы получить только подэлементы некоторого "индексированного" узла:

//foo[1]/bar[@type='artist']

Пример на С#:

string xml =
    @"<root>
        <foo>
            <bar type='artist'> Artist 1 </bar>
            <bar type='artist'> Artist 2 </bar>
            <bar type='artist'> Artist 3 </bar>
        </foo>
        <foo>
            <bar type='artist'> Artist 1 </bar>
            <bar type='artist'> Artist 2 </bar>
            <bar type='artist'> Artist 3 </bar>
            <bar type='artist'> Artist 4 </bar>
        </foo>
    </root>";
XmlDocument document = new XmlDocument();
document.LoadXml(xml);

Assert.That(document.SelectNodes(@"/root/foo[1]/bar[@type='artist']").Count,
                                 Is.EqualTo(3));
Assert.That(document.SelectNodes(@"//foo[1]/bar[@type='artist']").Count,
                                 Is.EqualTo(3));
person Elisha    schedule 26.03.2010
comment
Спасибо Элиша. Это выглядит близко к тому, что мне нужно. Попробую позже. Кстати, я работаю с pythons lxml, поэтому мне придется немного адаптировать это. - person Rasputin Jones; 26.03.2010