2013-09-02 7 views
6

Mentre lavoravo con xpath (che non è stato molto lungo), mi sono imbattuto in qualcosa di strano.Perché l'espressione di selezione della posizione xpath restituisce più nodi?

versione abbreviata del xml (L'XML completo è here e uno snapshot è accessibile 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> 

L'espressione

//route[1] 

restituito il primo nodo route come mi aspettavo. Tuttavia, quando si tenta di selezionare il primo nodo message, con

//message[1] 

multipla message nodi sono stati restituiti, piuttosto che uno solo.

Inizialmente ho pensato che fosse un problema di piattaforma, ma testando su Android, Desktop Java e un paio di tester di XP online, sto ottenendo gli stessi risultati.

Quale potrebbe essere il problema?

+1

Domanda molto buona e fondamentale .. * + 1 * per lo stesso .. –

+0

possibile duplicato di [ottenere primo nodo in set di risultati xpath] (http://stackoverflow.com/questions/9199415/getting-first- node-in-xpath-result-set) –

risposta

8

Entrambe le espressioni rappresentano rispettivamente il primo route e message figlio del suo genitore. Tutti i tuoi route s sono fratelli che condividono un solo genitore body, quindi il primo di questi viene restituito e solo quello. Tuttavia, ognicontiene il proprio gruppo di figli message, il primo dei quali viene restituito per ogni nodo route.

Se è necessario far corrispondere il primo elemento message in tutto il documento XML, usare:

(//message)[1] 

Le parentesi dice il processore per trovare i nodi corrispondenti //message, quindi il predicato [1] che viene dopo raccoglie il primo a scendere di quei nodi. Senza di essi il predicato [1] funzionerà semplicemente in base ai figli del nodo padre.


Perché io sono un drogato di selettore CSS: le controparti selettore per le espressioni XPath sono rispettivamente route:nth-of-type(1) e message:nth-of-type(1),.

+0

Sono ancora confuso .. anche se sei corretto .. Nell'espressione 'xpath' come' // message [1] 'seleziona l'elemento' message', la cui posizione è la prima .. Ma è ambiguo per me ... sempre .. –

+2

@Babai: cosa è ambiguo riguardo "il primo' route' e 'message' figlio del suo genitore"? – BoltClock

+0

@BoltClock Grazie per la risposta! Ha senso. –

Problemi correlati