Compartir a través de


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.

NotaNota

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 ReadState del objeto XmlReader se establece en Initial. Cuando por primera vez se llama al método Read del objeto XmlReader, 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 ReadState del objeto XmlReader 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

Referencia

XmlDocument

XPathDocument

XPathNavigator

Conceptos

Procesamiento de datos XML con el modelo de datos XPath

Navegación por un conjunto de nodos con XPathNavigator

Navegación por nodos de espacios de nombres y atributos con XPathNavigator

Acceso a datos XML fuertemente tipados utilizando XPathNavigator