XPath e Selezione di un singolo nodo
Domanda
Sto utilizzando XPath in .NETTO per il parsing di un documento XML, lungo le linee di:
XmlNodeList lotsOStuff = doc.SelectNodes("//stuff");
foreach (XmlNode stuff in lotsOStuff) {
XmlNode stuffChild = stuff.SelectSingleNode("//stuffChild");
// ... etc
}
Il problema è che la Query XPath per stuffChild
è sempre restituire il bambino del primo stuff
elemento, non il resto.Può XPath non essere usato per interrogare confronti di un individuo XMLElement
?
Soluzione
//
all'inizio di un'espressione XPath che inizia dalla radice del documento.Provare ".//stuffChild"..è una scorciatoia per l'auto::node(), che permetterà di impostare il contesto per la ricerca, e // è l'abbreviazione per il discendente asse.
Quindi si ha:
XmlNode stuffChild = stuff.SelectSingleNode(".//stuffChild");
che si traduce in:
xmlNode stuffChild = roba.SelectSingleNode("self::node()/descendant::stuffChild");
xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant-or-self::stuffChild");
Nel caso In cui il nodo figlio potrebbe avere lo stesso nome del padre, potrebbe essere necessario utilizzare un po ' più dettagliato sintassi che segue, per garantire che non si ri-selezionare il padre:
xmlNode stuffChild = stuff.SelectSingleNode("self::node()/descendant::stuffChild");
Si noti inoltre che se "stuffChild" è un discendente diretto di "roba", è possibile omettere completamente i prefissi, e selezionare il pulsante "stuffChild".
XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
Il W3Schools tutorial dispone di informazioni utili in un facile da digerire formato.
Altri suggerimenti
Il //
si utilizza in fronte stuffChild
significa che stai cercando stuffChild
elementi, a partire dalla radice.
Se si desidera avviare il nodo corrente (decendants del nodo corrente), si dovrebbe utilizzare .//
, come in:
stuff.SelectSingleNode(".//stuffChild");
Se "stuffChild" è un nodo figlio di "roba", quindi il tuo xpath dovrebbe essere:
XmlNode stuffChild = stuff.SelectSingleNode("stuffChild");
La selezione di un singolo nodo significa che è necessario solo il primo elemento.Quindi, la soluzione migliore è:
XmlNode stuffChild = stuff.SelectSingleNode("descendant::stuffChild[1]");