2013-09-02 16 views
6

Podczas pracy z xpath (która nie była zbyt długa), natknąłem się na coś dziwnego.Dlaczego wyrażenie wyboru pozycji xpath zwraca wiele węzłów?

skróconego XML (pełna XML jest here i migawki są dostępne na 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> 

Wyrażenie

//route[1] 

zwrócone pierwsze route węzeł się jak oczekiwano. Jednak gdy próbuje wybrać pierwszą message węzeł, z

//message[1] 

stwardnienie message węzłów zostały zwrócone, a nie tylko jeden.

Początkowo założyłem, że był to problem z platformą, ale testy na systemie Android, Java na komputer i kilku testerów online xpath przyniosły takie same wyniki.

Co może być problemem?

+1

Bardzo dobre i fundamentalne pytanie .. * + 1 * za to samo .. –

+0

możliwy duplikat [otrzymanie pierwszego węzła w zestawie wyników xpath] (http://stackoverflow.com/questions/9199415/getting-first- node-in-xpath-result-set) –

Odpowiedz

8

Oba wyrażenia reprezentują odpowiednio pierwsze potomstwo swojego rodzica route i message. Wszystkie twoje route s rodzeństwa dzielą jednego rodzica body, więc pierwszy z nich jest zwracany i tylko to. Jednak każdy z nich zawiera własny zbiór message elementów potomnych, z których pierwszy jest zwracany dla każdego węzła route.

Jeśli trzeba dopasować pierwszy message element całego dokumentu XML, użyj:

(//message)[1] 

nawiasie informuje procesor znalezienia węzłów pasujących //message, wówczas [1] orzeczenie, że przychodzi po odbierze pierwszy z tych węzłów. Bez nich predykat [1] będzie po prostu działał w oparciu o elementy potomne węzła nadrzędnego.


Bo jestem ćpunem selektora CSS: odpowiedniki selektor dla Twoich wyrażeń XPath są route:nth-of-type(1) i message:nth-of-type(1) odpowiednio.

+0

Wciąż jestem zdezorientowany ... chociaż masz rację. W wyrażeniu 'xpath' jak' ///message [1] 'wybiera element' message', którego pozycja jest pierwsza. Ale jest to dla mnie niejednoznaczne .. jeszcze ... –

+2

@Babai: Co jest niejednoznaczne w odniesieniu do "pierwszego" trasy "i" wiadomości "dziecka jej rodzica? – BoltClock

+0

@BoltClock Dzięki za odpowiedź! To ma sens. –

Powiązane problemy