Compartilhar via


Extrair dados XML usando XPathNavigator

Há várias maneiras diferentes de representar um documento XML no Microsoft .NET Framework. Isso inclui usar um String ou usar as classes XmlReader, XmlWriter, XmlDocument ou XPathDocument. Para facilitar a movimentação entre essas diferentes representações de um documento XML, a classe XPathNavigator fornece alguns métodos e propriedades para extrair XML como um objeto String, XmlReader ou XmlWriter.

Converter um XPathNavigator em uma cadeia de caracteres

A propriedade OuterXml da classe XPathNavigator é usada para obter a marcação do documento XML inteiro ou apenas a marcação de um único nó e seus nós filho.

Observação

A propriedade InnerXml obtém a marcação de apenas os nós filho de um nó.

O exemplo de código a seguir mostra como salvar um documento XML inteiro contido em um objeto XPathNavigator como um String, bem como um único nó e seus nós filho.

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;  

Converter um XPathNavigator em um XmlReader

O método ReadSubtree é usado para transmitir o conteúdo inteiro de um documento XML ou apenas um único nó e seus nós filho para um objeto XmlReader.

Quando o objeto XmlReader é criado com o nó atual e seus nós filho, a propriedade XmlReader do objeto ReadState é definida como Initial. Quando o método XmlReader do objeto Read é chamado pela primeira vez, o XmlReader é movido para o nó atual XPathNavigator. O novo objeto XmlReader continua a leitura até o final da árvore XML. Neste ponto, o método Read retorna false e a propriedade XmlReader do objeto ReadState é definida como EndOfFile.

A posição do objeto XPathNavigator é inalterada pela criação ou movimento do objeto XmlReader. O método ReadSubtree é válido somente quando posicionado em um elemento ou um nó raiz.

O exemplo a seguir mostra como obter um objeto XmlReader que contém o documento XML inteiro em um objeto XPathDocument assim como um único nó e seus nós filho.

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

O exemplo usa o arquivo books.xml como entrada.

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

Convertendo um XPathNavigator em um XmlWriter

O método WriteSubtree é usado para transmitir o conteúdo inteiro de um documento XML ou apenas um único nó e seus nós filho para um objeto XmlWriter.

A posição do objeto XPathNavigator é inalterada pela criação do objeto XmlWriter.

O exemplo a seguir mostra como obter um objeto XmlWriter que contém o documento XML inteiro em um objeto XPathDocument assim como um único nó e seus nós filho.

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

O exemplo usa o arquivo books.xml localizado anteriormente neste tópico como entrada.

Confira também