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

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

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

Resumo

Este exemplo carrega um XPathDocument objeto com dados XML, cria um XPathNavigator objeto como uma exibição nos dados e exibe o XML percorrendo o documento.

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

  • System.Xml
  • System.Xml.XPath

Para obter uma versão do Microsoft Visual Basic .NET deste artigo, consulte Como navegar em 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 XPath (XML Path Language)

Como usar a classe XPathNavigator para navegar em 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 incluído nos inícios rápidos do SDK (Software Development Kit) do .NET. Se você não tiver os Guias de início rápido instalados e não quiser instalá-los, consulte a seção Referências para obter o local de download Books.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 copiá Books.xml para a \Bin\Debug pasta localizada na pasta na qual você criou este projeto.

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

  3. Use a using instrução nos Xml namespaces and XPath para que você não precise qualificar declarações nesses namespaces posteriormente em seu código. Você pode usar a instrução antes de using 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 conter o documento XML e um XPathNavigator objeto para avaliar XPath expressões e mover-se pelo documento. Declare um String objeto para conter 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 amostra Books.xml. A XPathDocument classe usa 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 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ê percorra os nós de atributos e os nós de namespace em um documento XML.

    // Create a navigator to query with XPath.
    nav = docNav.CreateNavigator();
    
  7. Vá para a raiz do documento com o MoveToRoot método. MoveToRoot Define o navegador para o nó do 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 mover para os filhos do documento XML. O MoveToFirstChild método é movido para o primeiro filho do nó atual. Se houver a fonte Books.xml , você está se afastando do documento raiz para os filhos, 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 irmão. O MoveToNext método é movido 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 algum atributo. 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 percorre apenas os descendentes do nó raiz e não a árvore inteira.

    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 prontamente os resultados acima.

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

Listagem de código completo

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:

Ocorreu uma exceção sem tratamento do tipo System.Xml.XmlException 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 aparecer 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 resolver o erro, remova os caracteres de espaço em branco que precedem o primeiro nó no documento books.xml.

Referências