Запросы XPath и пространства имен
Запросы XPath учитывают наличие пространств имен в XML-документе и могут использовать префиксы пространств имен для дополнения имен элементов и атрибутов.Добавление префикса пространства имен к именам элементов и атрибутов ограничивает набор узлов, возвращаемых запросом XPath, лишь теми узлами, которые принадлежат к определенному пространству имен.
Например, если префикс books соответствует пространству имен https://www.contoso.com/books, то следующий запрос XPath /books:books/books:book выберет только элементы book в пространстве имен https://www.contoso.com/books.
Класс XmlNamespaceManager
Чтобы использовать пространства имен в запросе XPath, объект, производный от интерфейса IXmlNamespaceResolver, например класс XmlNamespaceManager, конструируется с URI-кодом пространства имен и префиксом, включаемым в запрос XPath.
Объект XmlNamespaceManager можно использовать в запросе любым из следующих способов.
Объект XmlNamespaceManager связывается с существующим объектом XPathExpression с помощью метода SetContext объекта XPathExpression.Также можно скомпилировать новый объект XPathExpression с помощью статического метода Compile, который принимает в качестве параметров строку, представляющую выражение XPath, и объект XmlNamespaceManager, а затем возвращает новый объект XPathExpression.
Сам объект XmlNamespaceManager передается в качестве параметра методу класса XPathNavigator вместе со строкой, представляющей выражение XPath.
Далее представлены методы класса XPathNavigator, которые принимают в качестве параметра объект, производный от интерфейса IXmlNamespaceResolver.
Пространство имен по умолчанию
В следующем XML-документе используется пространство имен по умолчанию с пустым префиксом, чтобы объявить пространство имен https://www.contoso.com/books.
<books xmlns="http://www.example.com/books">
<book>
<title>Title</title>
<author>Author Name</author>
<price>5.50</price>
</book>
</books>
XPath обрабатывает пустой префикс как пространство имен null.Другими словами, в запросах XPath можно использовать только префиксы, сопоставленные с пространствами имен.Это значит, что если нужно построить запрос к пространству имен в XML-документе, то даже если оно является пространством имен по умолчанию, для него необходимо определить префикс.
Например, если не определить префикс для представленного выше XML-документа, запрос XPath /books/book не вернет никаких результатов.
Префикс должен быть привязан, чтобы исключить неоднозначность во время запроса документов, часть узлов которых лежит вне пространства имен, а часть — в пространстве имен по умолчанию.
В следующем коде определяется префикс для пространства имен по умолчанию и выбираются все элементы book из пространства имен https://www.contoso.com/books.
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
Dim query As XPathExpression = navigator.Compile("/books:books/books:book")
Dim manager As XmlNamespaceManager = New XmlNamespaceManager(navigator.NameTable)
manager.AddNamespace("books", "https://www.contoso.com/books")
query.SetContext(manager)
Dim nodes As XPathNodeIterator = navigator.Select(query)
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
XPathExpression query = navigator.Compile("/books:books/books:book");
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("books", "https://www.contoso.com/books");
query.SetContext(manager);
XPathNodeIterator nodes = navigator.Select(query);
См. также
Ссылки
Основные понятия
Обработка XML-данных с использованием модели данных XPath
Выборка XML-данных с помощью XPathNavigator
Вычисление выражения XPath с помощью класса XPathNavigator
Соответствие узлов с помощью XPathNavigator