Partilhar 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 XPathNavigator classe fornece vários métodos e propriedades para extrair o XML como um Stringobjeto ou XmlReaderXmlWriter objeto.

Converter um XPathNavigator em uma String

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

Observação

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

O exemplo de código a seguir mostra como salvar um documento XML inteiro contido em um XPathNavigator objeto 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 ReadSubtree método é usado para transmitir todo o conteúdo de um documento XML ou apenas um único nó e seus nós filhos para um XmlReader objeto.

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 do XPathNavigator. O novo XmlReader objeto continua a ser lido até que o final da árvore XML seja alcançado. Neste ponto, o Read método retorna false e a XmlReader propriedade do ReadState objeto é definida como EndOfFile.

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

O exemplo a seguir mostra como obter um objeto XmlReader que contém todo o documento XML dentro de um objeto XPathDocument, bem como um nó único com 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 WriteSubtree método é usado para transmitir todo o conteúdo de um documento XML ou apenas um único nó e seus nós filhos para um XmlWriter objeto.

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

O exemplo a seguir mostra como obter um objeto XmlWriter que contém todo o documento XML dentro de um objeto XPathDocument, bem como um nó único com 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 books.xml arquivo encontrado anteriormente neste tópico como entrada.

Ver também