Extraer datos XML con XPathNavigator

Existen varias formas de representar un documento XML en Microsoft .NET Framework. Entre ellas se incluye el uso de String o de las clases XmlReader, XmlWriter, XmlDocument o XPathDocument. Para que sea más fácil moverse entre estas diferentes representaciones de un documento XML, la clase XPathNavigator incluye una serie de métodos y propiedades para extraer el código XML como un objeto String, XmlReader o XmlWriter.

Conversión de XPathNavigator en una cadena

La propiedad OuterXml de la clase XPathNavigator se utiliza para obtener el marcado de todo el documento XML o tan sólo el de un nodo y sus nodos secundarios.

Nota

La propiedad InnerXml obtiene solamente el marcado de los nodos secundarios de un nodo.

El siguiente código muestra cómo guardar todo un documento XML contenido en un objeto XPathNavigator como String, así como un solo nodo y sus nodos secundarios.

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;  

Conversión de XPathNavigator en XmlReader

El método ReadSubtree se utiliza para secuenciar todo el contenido de un documento XML o tan sólo un nodo y sus nodos secundarios en un objeto XmlReader.

Cuando se crea el objeto XmlReader con el nodo actual y sus nodos secundarios, la propiedad XmlReader del objeto ReadState se establece en Initial. Cuando por primera vez se llama al método XmlReader del objeto Read, XmlReader se desplaza al nodo actual de XPathNavigator. El nuevo objeto XmlReader continúa leyendo hasta llegar al final del árbol de XML. En este punto, el método Read devuelve false y la propiedad XmlReader del objeto ReadState se establece en EndOfFile.

La posición del objeto XPathNavigator no cambia debido a la creación o el movimiento del objeto XmlReader. El método ReadSubtree sólo es válido cuando se encuentra situado en un elemento o en un nodo raíz.

En el siguiente ejemplo se muestra cómo obtener un objeto XmlReader que contiene todo el documento XML de un objeto XPathDocument, así como un solo nodo y sus nodos secundarios.

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();  

En el ejemplo se toma como entrada el archivo books.xml.

<?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>

Conversión de XPathNavigator en XmlWriter

El método WriteSubtree se utiliza para secuenciar todo el contenido de un documento XML o tan sólo un nodo y sus nodos secundarios en un objeto XmlWriter.

La posición del objeto XPathNavigator no cambia debido a la creación del objeto XmlWriter.

En el siguiente ejemplo se muestra cómo obtener un objeto XmlWriter que contiene todo el documento XML de un objeto XPathDocument, así como un solo nodo y sus nodos secundarios.

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();  

El ejemplo toma como entrada el archivo books.xml que aparecía anteriormente en este tema.

Vea también