Usar o Visual C# para navegar por documentos XML com a classe XPathNavigator

Este artigo descreve como navegar documentos XML com um XPathNavigator objeto criado a partir de um XPathDocument objeto.

Versão original do produto: Visual C#
Número de KB original: 308343

Resumo

Este exemplo carrega um XPathDocument objeto com dados XML, cria um objeto como uma exibição XPathNavigator sobre os dados e exibe o XML andando pelo documento.

Este artigo refere-se aos seguintes namespaces da Biblioteca de Classes da Microsoft .NET Framework:

  • System.Xml
  • System.Xml.XPath

Para obter uma versão do .NET do Microsoft Visual Basic deste artigo, consulte Como navegar XML com a classe XPathNavigator usando o Visual Basic.

Requisitos

Este artigo pressupõe que você esteja familiarizado com os seguintes tópicos:

  • Visual C#
  • Terminologia XML
  • Criando e lendo um arquivo XML
  • Sintaxe XML Path Language (XPath)

Como usar a classe XPathNavigator para navegar no XML

  1. Crie um novo aplicativo de console do Visual C# no Visual Studio.

    Observação

    Este exemplo usa um arquivo chamado Books.xml. Você pode criar seu próprio arquivo Books.xml ou usar o exemplo que está incluído com os inícios rápidos do .NET Software Development Kit (SDK). Se você não tiver os Inícios Rápidos instalados e não quiser instalá-los, consulte a seção Referências para o local de downloadBooks.xml . Se você tiver os Inícios Rápidos instalados, Books.xml estará localizado na seguinte pasta:
    \Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB

    Você pode copiar Books.xml para a \Bin\Debug pasta localizada na pasta na qual você criou esse projeto.

  2. Verifique se o projeto faz referência ao System.Xml namespace.

  3. Use a using instrução nos Xml namespaces e XPath para que você não seja obrigado a qualificar declarações nesses namespaces posteriormente em seu código. Você pode usar a using instrução antes de qualquer outra declaração, da seguinte maneira:

    using System.Xml;
    using System.Xml.XPath;
    
  4. Declare as variáveis apropriadas. Declare um XPathDocument objeto para manter o documento XML e um XPathNavigator objeto para avaliar XPath expressões e mover-se através do documento. Declare um String objeto para manter a XPath expressão. Adicione o código de declaração no Main procedimento no Módulo1.

    XPathNavigator nav;
    XPathDocument docNav;
    
  5. Carregue um XPathDocument objeto com o arquivo de exemploBooks.xml. A XPathDocument classe usa o XSLT (Extensible Stylesheet Language Transformations) para fornecer um cache rápido e orientado ao desempenho para processamento de documentos XML. É semelhante ao DOM (Modelo de Objeto de Documento XML), mas é altamente otimizado para o processamento XSLT e o modelo de dados XPath.

    // Open the XML.
    docNav = new XPathDocument(@"c:\books.xml");
    
  6. Crie um XPathNavigator objeto a partir do documento. XPathNavigator permite que você mova os nós de atributos e os nós do namespace em um documento XML.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Mova para a raiz do documento com o MoveToRoot método. MoveToRoot define o navegador como o nó de documento que contém toda a árvore de nós.

    //Initial XPathNavigator to start at the root.
    nav.MoveToRoot();
    
  8. Use o MoveToFirstChild método para migrar para os filhos do documento XML. O MoveToFirstChild método se move para o primeiro filho do nó atual. Se houver a fonteBooks.xml , você está se afastando do documento raiz para as crianças, a seção Comentário e o nó Livraria.

    //Move to the first child node (comment field).
    nav.MoveToFirstChild();
    
  9. Use o MoveToNext método para iterar por meio de nós no nível do irmão. O MoveToNext método se move para o próximo irmão do nó atual.

    //Loop through all of the root nodes.
    do
    {
    } while (nav.MoveToNext());
    
  10. Use a NodeType propriedade para garantir que você esteja processando apenas nós de elemento e use a Value propriedade para exibir a representação de texto do elemento.

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //Determine whether children exist.
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
    
                //Loop through all the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  11. Use a HasAttributes propriedade para determinar se um nó tem atributos. Você também pode usar outros métodos, como MoveToNextAttribute, para mover para um atributo e inspecionar seu valor.

    Observação

    Esse segmento de código só percorre os descendentes do nó raiz e não toda a árvore.

    do
    {
       //Find the first element.
       if (nav.NodeType == XPathNodeType.Element)
       {
            //if children exist
            if (nav.HasChildren == true)
            {
                //Move to the first child.
                nav.MoveToFirstChild();
                //Loop through all the children.
                do
                {
                    //Display the data.
                    Console.Write("The XML string for this child ");
                    Console.WriteLine("is '{0}'", nav.Value);
    
                    //Check for attributes.
                    if (nav.HasAttributes == true)
                    {
                        Console.WriteLine("This node has attributes");
                    }
                } while (nav.MoveToNext());
            }
        }
    } while (nav.MoveToNext());
    
  12. Use o ReadLine método do Console objeto para adicionar uma pausa no final da exibição do console para exibir mais facilmente os resultados acima.

    //Pause.
    Console.ReadLine();
    
  13. Crie e execute o projeto do Visual C#.

Lista de código completa

using System;
using System.Xml;
using System.Xml.XPath;

namespace q308343
{
    class Class1
    {
        static void Main(string[] args)
        {
            XPathNavigator nav;
            XPathDocument docNav;

            docNav = new XPathDocument(@"c:\books.xml");
            nav = docNav.CreateNavigator();
            nav.MoveToRoot();

            //Move to the first child node (comment field).
            nav.MoveToFirstChild();

            do
            {
                //Find the first element.
                if (nav.NodeType == XPathNodeType.Element)
                {
                    //Determine whether children exist.
                    if (nav.HasChildren == true)
                    {
                        //Move to the first child.
                        nav.MoveToFirstChild();
                        //Loop through all of the children.
                        do
                        {
                            //Display the data.
                            Console.Write("The XML string for this child ");
                            Console.WriteLine("is '{0}'", nav.Value);
                            //Check for attributes.
                            if (nav.HasAttributes == true)
                            {
                                Console.WriteLine("This node has attributes");
                            }
                        } while (nav.MoveToNext());
                    }
                }
            } while (nav.MoveToNext());
            //Pause.
            Console.ReadLine();
        }
    }
}

Solução de problemas

Ao testar o código, você pode receber a seguinte mensagem de erro de exceção:

Uma exceção não tratada do tipo System.Xml. XmlException ocorreu em system.xml.dll
Informações adicionais: declaração XML inesperada. A declaração XML deve ser o primeiro nó no documento e nenhum caractere de espaço em branco pode ser exibido antes dele. Linha 1, posição

O erro de exceção ocorre na seguinte linha de código:

docNav = new XPathDocument("c:\\books.xml");

Para resolve o erro, remova os caracteres de espaço em branco que precedem o primeiro nó no documento books.xml.

Referências