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
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.Verifique se o projeto faz referência ao
System.Xml
namespace.Use a
using
instrução nosXml
namespaces eXPath
para que você não seja obrigado a qualificar declarações nesses namespaces posteriormente em seu código. Você pode usar ausing
instrução antes de qualquer outra declaração, da seguinte maneira:using System.Xml; using System.Xml.XPath;
Declare as variáveis apropriadas. Declare um
XPathDocument
objeto para manter o documento XML e umXPathNavigator
objeto para avaliarXPath
expressões e mover-se através do documento. Declare umString
objeto para manter aXPath
expressão. Adicione o código de declaração noMain
procedimento no Módulo1.XPathNavigator nav; XPathDocument docNav;
Carregue um
XPathDocument
objeto com o arquivo de exemploBooks.xml. AXPathDocument
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");
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();
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();
Use o
MoveToFirstChild
método para migrar para os filhos do documento XML. OMoveToFirstChild
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();
Use o
MoveToNext
método para iterar por meio de nós no nível do irmão. OMoveToNext
método se move para o próximo irmão do nó atual.//Loop through all of the root nodes. do { } while (nav.MoveToNext());
Use a
NodeType
propriedade para garantir que você esteja processando apenas nós de elemento e use aValue
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());
Use a
HasAttributes
propriedade para determinar se um nó tem atributos. Você também pode usar outros métodos, comoMoveToNextAttribute
, 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());
Use o
ReadLine
método doConsole
objeto para adicionar uma pausa no final da exibição do console para exibir mais facilmente os resultados acima.//Pause. Console.ReadLine();
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
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários