2011-08-24 13 views
6

Ho la seguente parte del file xml.Come recuperare l'ultimo nodo usando XPath in C#?

<UN N="@U1"> 
    <DT N="24/06/2011"> 
     <PN N="@P1"> 
      <TM N="02:24:11"> 
       <JB T="GP"> 
        <A>notepad</A> 
        <Z>Notepad</Z> 
        <N>Untitled - Notepad</N> 
        <J>1;0;1;1;0;0</J> 
        <C>0.00500;0.09500;0.03500</C> 
        <S>1;0;1;1</S> 
        <P>0;0</P> 
        <F>0</F> 
       </JB> 
      </TM> 
     </PN> 
    </DT> 

    <DT N="23/06/2011"> 
     <PN N="@P1"> 
      <TM N="02:38:49"> 
       <JB T="PAGP"> 
        <A>notepad</A> 
        <Z>Notepad</Z> 
        <N>Untitled - Notepad</N> 
        <J>1;1;1;1;0;1</J> 
        <C>0.00500;0.09500;0.03500</C> 
        <S>1;1;0;0</S> 
        <P>1;1</P> 
        <F>0</F> 
       </JB> 
      </TM>    
     </PN> 
    </DT> 

    ..... 
    ..... 

</UN> 

Ho bisogno di ottenere l'ultimo nodo dove PN N = @ P1.

La query di esempio sarà apprezzata.

Grazie in anticipo.

+0

Siete alla ricerca di un '

' o '' nodo da trovare? – Richard

risposta

5

È possibile utilizzare la funzione XPath last() per individuare l'ultimo di un set di nodi. Quindi l'ultima <PN> nodo con attribyte N avendo un valore @P1 sarebbe:

//PN[@N='@P1'][position() = last()] 

Il codice .NET dipenderà da quale API XML che si sta utilizzando: XmlDocument, XPathDocument o LINQ to XML (XDocument). (L'approccio con XmlReader potrebbe essere quella di caricare in uno dei tre e quindi utilizzare tale.)

Edit (sulla base di commenti) Per riportare la <F> discendente dell'ultimo <PN> con l'attributo di cui sopra, in cui xDoc è un istanza di XmlDocument:

var foundNode = xDoc.SelectSingleNode("//PN[@N='@P1'][position() = last()]/TM/JB/F"); 

Modifica # 2 (in base a un altro commento): Per riportare il ultima<PN> dove ogni <DT> può contenere più <DT> elementi attraverso tutti gli elementi <DT>.

Testare questo con alcuni meglio XML di esempio (vedi sotto), utilizzando XmlElement.SelectNodes e poi scorrere il set di nodi tornato ha dimostrato che era stato trovato il nodo di destra, semplicemente non era il primo e quindi non restituito da SelectSingleNode. Questo è l'indizio: il predicato last() veniva applicato all'interno di ciascuna corrispondenza //PN[@N='@P1']. Un rapido cambio di precedenza era tutto ciò che era necessario:

(//PN[@N='@P1'])[last()] 

Per riferimento futuro, se sono possibili più elementi, quindi mostrare almeno due nel campione, altrimenti i lettori assumeranno istanze solo singolari . Anche striscia fuori tutti i nodi (come i bambini) non necessari:

L'XML di esempio che ho usato per la prova (aggiunto x attributi per rendere più facile per identificare l'elemento selezionato durante il test):

<UN N='@U1'> 
    <DT N='24/06/2011'> 
    <PN N='@P1' x='#1'/> 
    <PN N='@P1' x='#2'/> 
    <PN N='@P2' x='#3'/> 
    </DT> 

    <DT N='24/06/2011'> 
    <PN N='@P1' x='#4'/> 
    <PN N='@P1' x='#5'/> 
    <PN N='@P2' x='#6'/> 
    </DT> 

    <DT N='24/06/2011'> 
    <PN N='@P3' x='#7'/> 
    <PN N='@P4' x='#8'/> 
    <PN N='@P5' x='#9'/> 
    </DT> 
</UN> 
+0

Grazie, sta funzionando superbamente. Cosa succede se voglio recuperare l'ultimo nodo di TM/JB/F dal nodo restituito. Sto usando la classe XmlDocument. – Syed

+0

Mi sono trovato.sarà così: '@ "// PN [@N =' @ P1 '] [position() = last()]/TM [position() = last()]/JB/F";' Qualsiasi cosa grazie per XPath iniziale. – Syed

+0

Scusate il commento in ritardo. Restituisce il primo nodo PN dell'ultimo DT, ma ho bisogno dell'ultimo nodo indipendentemente dal DT nel file .xml. Nota: il file .xml può contenere un numero qualsiasi di DT e all'interno di DT contiene molti numeri di PN. – Syed

6

L'operazione XPath:

"/UN/DT[PN/@N='@p1'][last()]" 

tornerà l'ultimo nodo DT per cui [email protected].

Problemi correlati