Estrazione di dati XML con XPathNavigator
Sono disponibili diversi metodi per rappresentare un documento XML in Microsoft .NET Framework, inclusi l'uso di una classe String o l'uso delle classi XmlReader, XmlWriter, XmlDocument o XPathDocument. Per facilitare lo spostamento tra queste diverse rappresentazioni di un documento XML, la classe XPathNavigator offre una serie di metodi e proprietà per estrarre i dati XML come oggetto String, XmlReader o come oggetto XmlWriter.
Conversione di un XPathNavigator in stringa
La proprietà OuterXml della classe XPathNavigator viene usata per ottenere il markup dell'intero documento XML o di un singolo nodo e dei relativi nodi figlio.
Nota
La proprietà InnerXml ottiene solo il markup dei nodi figlio di un nodo.
Nell'esempio di codice seguente viene illustrato come salvare un intero documento XML contenuto in un oggetto XPathNavigator come String, sotto forma di nodo singolo assieme ai relativi nodi figlio.
Dim document As XPathDocument = New XPathDocument("input.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Save the entire input.xml document to a string.
Dim xml As String = navigator.OuterXml
' Now save the Root element and its child nodes to a string.
navigator.MoveToChild(XPathNodeType.Element)
Dim root As String = navigator.OuterXml
XPathDocument document = new XPathDocument("input.xml");
XPathNavigator navigator = document.CreateNavigator();
// Save the entire input.xml document to a string.
string xml = navigator.OuterXml;
// Now save the Root element and its child nodes to a string.
navigator.MoveToChild(XPathNodeType.Element);
string root = navigator.OuterXml;
Conversione di un XPathNavigator in XmlReader
Il metodo ReadSubtree viene usato per inviare il flusso dell'intero contenuto di un documento XML o solo di un singolo nodo e dei relativi nodi figlio a un oggetto XmlReader.
Quando viene creato l'oggetto XmlReader con il nodo corrente e i relativi nodi figlio, la proprietà XmlReader dell'oggetto ReadState viene impostata su Initial. Quando il metodo XmlReader dell'oggetto Read viene chiamato la prima volta, l'oggetto XmlReader viene spostato sul nodo corrente dell'oggetto XPathNavigator. Il nuovo oggetto XmlReader prosegue la lettura fino a quando non viene raggiunta la fine dell'albero XML. A questo punto il metodo Read restituisce false
e la proprietà XmlReader dell'oggetto ReadState viene impostata su EndOfFile.
La posizione dell'oggetto XPathNavigator non è stata modificata dalla creazione o dallo spostamento dell'oggetto XmlReader. Il metodo ReadSubtree è valido solo se è posizionato in corrispondenza di un elemento o di un nodo radice.
Nell'esempio di codice seguente viene illustrato come ottenere un oggetto XmlReader contenente l'intero documento XML contenuto in un oggetto XPathDocument sotto forma di nodo singolo assieme ai relativi nodi figlio.
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Stream the entire XML document to the XmlReader.
Dim xml As XmlReader = navigator.ReadSubtree()
While xml.Read()
Console.WriteLine(xml.ReadInnerXml())
End While
xml.Close()
' Stream the book element and its child nodes to the XmlReader.
navigator.MoveToChild("bookstore", "")
navigator.MoveToChild("book", "")
Dim book As XmlReader = navigator.ReadSubtree()
While book.Read()
Console.WriteLine(book.ReadInnerXml())
End While
book.Close()
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Stream the entire XML document to the XmlReader.
XmlReader xml = navigator.ReadSubtree();
while (xml.Read())
{
Console.WriteLine(xml.ReadInnerXml());
}
xml.Close();
// Stream the book element and its child nodes to the XmlReader.
navigator.MoveToChild("bookstore", "");
navigator.MoveToChild("book", "");
XmlReader book = navigator.ReadSubtree();
while (book.Read())
{
Console.WriteLine(book.ReadInnerXml());
}
book.Close();
Nell'esempio il file books.xml
viene considerato come input.
<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
Conversione di un XPathNavigator in XmlWriter
Il metodo WriteSubtree viene usato per inviare il flusso dell'intero contenuto di un documento XML o solo di un singolo nodo e dei relativi nodi figlio a un oggetto XmlWriter.
La posizione dell'oggetto XPathNavigator non è stata modificata dalla creazione dell'oggetto XmlWriter.
Nell'esempio di codice seguente viene illustrato come ottenere un oggetto XmlWriter contenente l'intero documento XML contenuto in un oggetto XPathDocument sotto forma di nodo singolo assieme ai relativi nodi figlio.
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Stream the entire XML document to the XmlWriter.
Dim xml As XmlWriter = XmlWriter.Create("newbooks.xml")
navigator.WriteSubtree(xml)
xml.Close()
' Stream the book element and its child nodes to the XmlWriter.
navigator.MoveToChild("bookstore", "")
navigator.MoveToChild("book", "")
Dim book As XmlWriter = XmlWriter.Create("book.xml")
navigator.WriteSubtree(book)
book.Close()
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Stream the entire XML document to the XmlWriter.
XmlWriter xml = XmlWriter.Create("newbooks.xml");
navigator.WriteSubtree(xml);
xml.Close();
// Stream the book element and its child nodes to the XmlWriter.
navigator.MoveToChild("bookstore", "");
navigator.MoveToChild("book", "");
XmlWriter book = XmlWriter.Create("book.xml");
navigator.WriteSubtree(book);
book.Close();
Nell'esempio il file books.xml
, trovato prima in questo argomento, viene considerato come input.