2013-09-02 11 views
6

Bei der Arbeit mit Xpath (die nicht sehr lange war), stieß ich auf etwas Seltsames.Warum würde ein Xpath-Positionsauswahlausdruck mehrere Knoten zurückgeben?

Verkürzte Version des xml (Der vollständige xml ist here und ein Überblick auf 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> 

Der Ausdruck

//route[1] 

zurück den ersten route Knoten wie ich erwartet hatte. Wenn jedoch die ersten message Knoten auszuwählen versucht, mit

//message[1] 

mehrere message Knoten zurückgegeben wurden, anstatt nur ein.

Zuerst ging ich davon aus, dass es sich um ein Plattformproblem handelte, aber bei Tests mit Android, Desktop Java und ein paar Online-Xpath-Testern erzielte ich dieselben Ergebnisse.

Was könnte das Problem sein?

+1

Sehr gute und grundlegende Frage .. * + 1 * für die gleichen .. –

+0

mögliche Duplikate von [erste Knoten in XPath Ergebnissatz erhalten] (http://StackOverflow.com/Questions/9199415/getting-first- node-in-xpath-result-set) –

Antwort

8

Beide Ausdrücke repräsentieren die ersten route und message Kind des jeweiligen Elternteils. Alle Ihre route s sind Geschwister teilen eine einzige body Eltern, so dass die erste von diesen zurückgegeben wird und nur das. Jede route enthält jedoch eine eigene Gruppe von message untergeordneten Elementen, von denen die erste für jeden route Knoten zurückgegeben wird.

Wenn Sie das erste message Element in Ihrem gesamten XML-Dokument entsprechen, verwenden:

(//message)[1] 

Die Klammern erzählt die Prozessorknoten finden //message einstimmt, dann wird das [1] Prädikat, das nach herauskommt nimmt die erste dieser Knoten. Ohne sie wird das Prädikat [1] einfach basierend auf den untergeordneten Knoten des übergeordneten Knotens ausgeführt.


Weil ich einen CSS-Selektor-Junkie bin: die Wähler Pendants für XPath-Ausdrücke sind route:nth-of-type(1) und message:nth-of-type(1) sind.

+0

Ich bin immer noch verwirrt .. obwohl du richtig bist .. In 'xpath' Ausdruck wie' // message [1] 'selektiert das' message' Element, dessen Position zuerst ist .. Aber es ist mehrdeutig für mich..still .. –

+2

@Babai: Was ist mehrdeutig über "die erste' route' und 'message' Kind seiner Eltern"? – BoltClock

+0

@BoltClock Danke für die Antwort! Es macht Sinn. –

Verwandte Themen