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?

È stato utile?

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]");
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top