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


Запросы XPath и пространства имен

Запросы XPath учитывают наличие пространств имен в XML-документе и могут использовать префиксы пространств имен для дополнения имен элементов и атрибутов. Добавление префикса пространства имен к именам элементов и атрибутов ограничивает набор узлов, возвращаемых запросом XPath, лишь теми узлами, которые принадлежат к определенному пространству имен.

Например, если префикс books соответствует пространству имен http://www.contoso.com/books, то следующий запрос XPath /books:books/books:book выберет только элементы book в пространстве имен http://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-документе используется пространство имен по умолчанию с пустым префиксом, чтобы объявить пространство имен http://www.contoso.com/books.

<books xmlns="http://www.contoso.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 из пространства имен http://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", "http://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", "http://www.contoso.com/books");  
query.SetContext(manager);  
XPathNodeIterator nodes = navigator.Select(query);  

См. также