Поделиться через


Запросы 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);

См. также

Ссылки

XmlDocument

XPathDocument

XPathNavigator

Основные понятия

Обработка XML-данных с использованием модели данных XPath

Выборка XML-данных с помощью XPathNavigator

Вычисление выражения XPath с помощью класса XPathNavigator

Соответствие узлов с помощью XPathNavigator

Типы узлов, распознаваемые запросами XPath

Скомпилированные выражения XPath