Selezione di nodi utilizzando l'esplorazione XPath

Il DOM contiene metodi che consentono di utilizzare l'esplorazione con XPath per eseguire delle query sulle informazioni nel DOM. È possibile utilizzare XPath per trovare un singolo nodo specifico o per trovare tutti i nodi che soddisfano certi criteri. Per recuperare uno o più nodi nel DOM senza XPath, è necessario scrivere una considerevole quantità di codice di esplorazione. XPath, invece, richiede solo una riga di codice. Nell'esempio seguente viene illustrato come recuperare un unico nodo di libro da un XmlDocument chiamato doc.

Dim bookNode as XmlNode
bookNode = nav.SelectSingleNode("//book")
[C#]
XmlNode bookNode = nav.SelectSingleNode("//book");

Per trovare un nodo specifico, viene utilizzato il metodo SelectSingleNode. Se vi sono più nodi che corrispondono ai criteri di ricerca, SelectSingleNode restituisce il primo nodo che li soddisfa, eseguendo l'esplorazione dall'alto della struttura verso il basso, in ordine di documento. Per recuperare più nodi in un gruppo di nodi, viene utilizzato il metodo SelectNodes.

SelectNodes restituisce un gruppo di nodi, che vengono inseriti in un oggetto XmlNodeList. XmlNodelist è stato enumerato per fornire la funzionalità dell'istruzione foreach. In questo modo è possibile scorrere in ciclo i nodi nella XmlNodeList.

Nell'esempio seguente viene illustrata una query XPath che restituisce tutti i nodi con autore del libro di nome Smith.

Dim root As XmlNode = doc.DocumentElement
nodeList = root.SelectNodes("descendant::book[author/last-name='Smith']")
[C#]
XmlNode root = doc.DocumentElement;
nodeList = root.SelectNodes("descendant::book[author/last-name='Smith']");

Dopo aver generato un elenco di nodi, è possibile eseguire un altro ciclo dell'elenco come illustrato nell'esempio seguente.

Dim book as XmlNode
For Each book in nodeList
   ' Do something.
Next
[C#]
foreach (XmlNode book in nodeList)
{
    // Do something.
}

La variabile di primo livello è stata impostata sull'elemento del documento. Impostando il punto iniziale per la query XPath si imposta il nodo del contesto, che è il punto iniziale da cui inizia la query XPath. Nell'esempio sopra illustrato la query XPath comincia al nodo di contesto di DocumentElement, memorizzato nella variabile root. Se non si desidera iniziare dall'elemento del documento, ma dal primo figlio dell'elemento del documento, è possibile codificare l'istruzione Select illustrata nell'esempio seguente.

doc.DocumentElement.FirstChild.Select(. . . )
[C#]
this doc.DocumentElement.FirstChild.Select(. . .);

Tutti gli oggetti XmlNodeList sono sincronizzati con il documento sottostante. Per questo motivo, se si scorre l'elenco dei nodi e si modifica il valore di un nodo, quest'ultimo verrà aggiornato anche nel documento dal quale proviene.

Nota   Quando si modifica il documento sottostante, è consigliabile rieseguire la selezione. Se il nodo modificato è un nodo che potrebbe causare l'aggiunta del nodo all'elenco dove non figurava in precedenza o la sua rimozione dall'elenco di nodi, non vi è garanzia che l'elenco dei nodi sia preciso.

Nell'esempio seguente viene modificato il prezzo di un libro nell'elenco di nodi e, contemporaneamente, il prezzo di quel nodo nel documento sottostante.

' Create the XmlDocument.
    Dim doc as XmlDocument = new XmlDocument()
    doc.Load("booksort.xml")
           
    Dim book as XmlNode
    Dim nodeList as XmlNodeList 
    Dim root as XmlNode = doc.DocumentElement

    nodeList=root.SelectNodes("descendant::book[author/last-name='Austen']")
 
    ' Change the price on the books.
    for each book in nodeList      
      book.LastChild.InnerText="15.95"
    next 

    Console.WriteLine("Display the modified XML document....")
    doc.Save(Console.Out)
    
[C#]
XmlDocument doc = new XmlDocument();
doc.Load("booksort.xml");

XmlNodeList nodeList;
XmlNode root = doc.DocumentElement;
nodeList=root.SelectNodes("descendant::book[author/last-name='Austen']");
 
// Change the price on the books.
foreach (XmlNode book in nodeList)
{
    book.LastChild.InnerText="15.95";
}
Console.WriteLine("Display the modified XML document....");
doc.Save(Console.Out);

Entrambi i metodi SelectNodes e SingleSelectNodes hanno un metodo di overloading che accetta come parametro un gestore dello spazio dei nomi. Il gruppo di spazi dei nomi del gestore viene utilizzato dalla query XPath per far corrispondere tali spazi ai nodi che si stanno cercando. Per ulteriori informazioni sul gestore degli spazi dei nomi, vedere Spazio dei nomi in un documento XML.

Vedere anche

Modello a oggetti di documenti XML (Document Object Model, DOM)