Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.XmlSystem.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
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\VBVocê pode copiá Books.xml para a
\Bin\Debugpasta localizada na pasta na qual você criou este projeto.Verifique se o projeto faz referência ao
System.Xmlnamespace.Use a
usinginstrução nosXmlnamespaces andXPathpara que você não precise qualificar declarações nesses namespaces posteriormente em seu código. Você pode usar a instrução antes deusingqualquer outra declaração, da seguinte maneira:using System.Xml; using System.Xml.XPath;Declare as variáveis apropriadas. Declare um
XPathDocumentobjeto para conter o documento XML e umXPathNavigatorobjeto para avaliarXPathexpressões e mover-se pelo documento. Declare umStringobjeto para conter aXPathexpressão. Adicione o código de declaração noMainprocedimento no Módulo1.XPathNavigator nav; XPathDocument docNav;Carregue um
XPathDocumentobjeto com o arquivo de amostra Books.xml. AXPathDocumentclasse 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");Crie um
XPathNavigatorobjeto a partir do documento.XPathNavigatorpermite 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();Vá para a raiz do documento com o
MoveToRootmétodo.MoveToRootDefine 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();Use o
MoveToFirstChildmétodo para mover para os filhos do documento XML. OMoveToFirstChildmé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();Use o
MoveToNextmétodo para iterar por meio de nós no nível irmão. OMoveToNextmétodo é movido para o próximo irmão do nó atual.//Loop through all of the root nodes. do { } while (nav.MoveToNext());Use a
NodeTypepropriedade para garantir que você esteja processando apenas nós de elemento e use aValuepropriedade 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
HasAttributespropriedade para determinar se um nó tem algum atributo. 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 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());Use o
ReadLinemétodo doConsoleobjeto para adicionar uma pausa no final da exibição do console para exibir mais prontamente os resultados acima.//Pause. Console.ReadLine();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.