È 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>
Siete alla ricerca di un '