2013-09-02 3 views
6

Работая с xpath (который был не очень длинным), я наткнулся на что-то странное.Почему выражение выбора позиции xpath возвращает несколько узлов?

укороченная версия XML (Полный XML является here и снимок доступен на pastebin):

<?xml version="1.0" encoding="utf-8" ?> 
<body copyright="All data copyright San Francisco Muni 2013."> 
    <route tag="all"> 
    <message id="10268" creator="jflynn" startBoundary="1378121400000" startBoundaryStr="Mon, Sep 02 04:30:00 PDT 2013" endBoundary="1378191540000" endBoundaryStr="Mon, Sep 02 23:59:00 PDT 2013" sendToBuses="false"> 
     <text>Sunday schedules today.</text> 
    </message> 
    </route> 
    <route tag="44"> 
    <message id="10221" creator="mlee" startBoundary="1377525600000" startBoundaryStr="Mon, Aug 26 07:00:00 PDT 2013" endBoundary="1382857140000" endBoundaryStr="Sat, Oct 26 23:59:00 PDT 2013" sendToBuses="false"> 
     <routeConfiguredForMessage tag="44">  <stop tag="6420" title="Silver Ave &amp; Revere Ave" /> 
</routeConfiguredForMessage> 
     <text>Stop moved&#10;across Revere&#10;During&#10;Construction</text> 
    </message> 
    <message id="10222" creator="mlee" startBoundary="1377525600000" startBoundaryStr="Mon, Aug 26 07:00:00 PDT 2013" endBoundary="1382857140000" endBoundaryStr="Sat, Oct 26 23:59:00 PDT 2013" sendToBuses="false"> 
     <routeConfiguredForMessage tag="44">  <stop tag="6420" title="Silver Ave &amp; Revere Ave" /> 
</routeConfiguredForMessage> 
     <text>Stop moved&#10;across Revere&#10;During&#10;Construction</text> 
    </message> 
    </route> 
</body> 

Выражение

//route[1] 

вернулся первый route узел, как я ожидал. Тем не менее, были возвращены при попытке выбрать первый message узел с

//message[1] 

несколько message узлов, а не только один.

Сначала я предполагал, что это была проблема платформы, но тестирование на Android, Desktop Java и пару онлайн-тестеров xpath я получаю одинаковые результаты.

В чем может быть проблема?

+1

Очень хороший и фундаментальный вопрос .. * + 1 * для того же .. –

+0

Возможный дубликат [получение первого узла в наборе результатов xpath] (http://stackoverflow.com/questions/9199415/getting-first- node-in-xpath-result-set) –

ответ

8

Оба выражения представляют собой первые route и message дочерние элементы его родителя, соответственно. Все ваши route s являются братьями и сестрами, совместно использующими один родитель body, поэтому первый из них возвращается и только это. Однако каждый route содержит свой собственный набор из message детей, первый из которых возвращается для каждого узла route.

Если вам нужно сопрягать первый message элемент всего документа XML, используйте:

(//message)[1] 

круглых скобках указывает процессору, чтобы найти узлы, соответствующие //message, то [1] предикат, который приходит после того, как выбирает первый из этих узлов. Без них предикат [1] будет просто работать на основе дочерних элементов их родительского узла.


Потому что я наркоман селектор CSS: контрагенты селектора для вашего XPath выражений route:nth-of-type(1) и message:nth-of-type(1) соответственно.

+0

Я все еще запутался .. хотя вы правы .. В выражении 'xpath', например' // message [1] 'выбирает элемент' message', позиция которого первая. Но для меня это двусмысленно .. –

+2

@Babai: Что двусмысленно в отношении «первого« маршрута »и« сообщения »его родителя? – BoltClock

+0

@BoltClock Спасибо за ответ! Это имеет смысл. –

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