Использование Visual C# для навигации по XML-документам с помощью класса XPathNavigator
В этой статье описывается, как перемещаться по XML-документам XPathNavigator
с помощью объекта, созданного XPathDocument
из объекта .
Исходная версия продукта: Visual C#
Исходный номер базы знаний: 308343
Сводка
Этот пример загружает XPathDocument
объект с XML-данными, создает XPathNavigator
объект в виде представления данных и отображает XML-код путем обхода документа.
В этой статье рассматриваются следующие пространства имен библиотеки классов Microsoft платформа .NET Framework:
System.Xml
System.Xml.XPath
Сведения о версии .NET для Microsoft Visual Basic см. в статье Навигация по XML с помощью класса XPathNavigator с помощью Visual Basic.
Требования
В этой статье предполагается, что вы знакомы со следующими разделами:
- Visual C#
- Терминология XML
- Создание и чтение XML-файла
- Синтаксис языка XML-пути (XPath)
Использование класса XPathNavigator для навигации по XML
Создание консольного приложения Visual C# в Visual Studio.
Примечание.
В этом примере используется файл с именемBooks.xml. Вы можете создать собственный файлBooks.xml или использовать пример, включенный в краткие руководства по пакету SDK для .NET. Если вы не установили быстрые руководства и не хотите их устанавливать, см. раздел Ссылки для расположения загрузкиBooks.xml . Если у вас установлены краткие руководства, Books.xml находится в следующей папке:
\Program Files\Microsoft.NET\FrameworkSDK\Samples\Quickstart\Howto\Samples\Xml\Transformxml\VB
Вы можете скопировать Books.xml в папку
\Bin\Debug
, расположенную под папкой, в которой был создан этот проект.Убедитесь, что проект ссылается на
System.Xml
пространство имен.Используйте инструкцию
using
дляXml
пространств имен иXPath
, чтобы не требовалось квалифицировать объявления в этих пространствах имен позже в коде. Оператор можно использоватьusing
перед любыми другими объявлениями следующим образом:using System.Xml; using System.Xml.XPath;
Объявите соответствующие переменные. Объявите
XPathDocument
объект для хранения XML-документа и объект для вычисленияXPath
выраженийXPathNavigator
и перемещения по документу. ОбъявитеString
объект для храненияXPath
выражения. Добавьте код объявления в процедуруMain
в Module1.XPathNavigator nav; XPathDocument docNav;
XPathDocument
Загрузите объект с примером файла Books.xml. КлассXPathDocument
использует расширяемые преобразования языка таблиц стилей (XSLT), чтобы обеспечить быстрый и ориентированный на производительность кэш для обработки XML-документов. Она похожа на объектную модель xml-документов (DOM), но хорошо оптимизирована для обработки XSLT и модели данных XPath.// Open the XML. docNav = new XPathDocument(@"c:\books.xml");
Создайте
XPathNavigator
объект из документа.XPathNavigator
позволяет перемещаться по узлам атрибутов и узлам пространства имен в XML-документе.// Create a navigator to query with XPath. nav = docNav.CreateNavigator();
Перейдите в корень документа с помощью
MoveToRoot
метода .MoveToRoot
задает для навигатора узел документа, содержащий все дерево узлов.//Initial XPathNavigator to start at the root. nav.MoveToRoot();
Используйте метод для
MoveToFirstChild
перемещения в дочерние элементы XML-документа. МетодMoveToFirstChild
перемещается к первому дочернему элементу текущего узла. Если источник Books.xml , вы переходите от корневого документа к дочерним элементам, разделу Comment и узлу Bookstore.//Move to the first child node (comment field). nav.MoveToFirstChild();
Используйте метод для
MoveToNext
итерации узлов на уровне одноуровневого уровня. МетодMoveToNext
перемещается в следующий одноуровневый элемент текущего узла.//Loop through all of the root nodes. do { } while (nav.MoveToNext());
NodeType
Используйте свойство , чтобы убедиться, что обрабатываются только узлы элементов, а свойство —Value
для отображения текстового представления элемента.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());
Используйте свойство ,
HasAttributes
чтобы определить, имеет ли узел какие-либо атрибуты. Вы также можете использовать другие методы, напримерMoveToNextAttribute
, для перемещения к атрибуту и проверки его значения.Примечание.
Этот сегмент кода проходит только по потомкам корневого узла, а не по всему дереву.
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());
ReadLine
Используйте метод объекта ,Console
чтобы добавить паузу в конце экрана консоли, чтобы быстрее отобразить приведенные выше результаты.//Pause. Console.ReadLine();
Выполните сборку и запуск проекта Visual C#.
Полный список кода
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();
}
}
}
Устранение неполадок
При тестировании кода может появилось следующее сообщение об ошибке исключения:
Необработанное исключение типа System.Xml. XmlException произошло в system.xml.dll
Дополнительные сведения: Неожиданное объявление XML. Объявление XML должно быть первым узлом в документе, и перед ним не могут отображаться символы пробелов. Строка 1, позиция
Ошибка исключения возникает в следующей строке кода:
docNav = new XPathDocument("c:\\books.xml");
Чтобы устранить эту ошибку, удалите символы с пробелами, которые предшествуют первому узлу в документе books.xml.
Ссылки
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по