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


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

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

Например, если префикс books сопоставляется с пространством http://www.contoso.com/booksимен, следующий запрос /books:books/books:book XPath выбирает только те book элементы в пространстве http://www.contoso.com/booksимен.

The 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-документа выше запрос /books/book XPath не вернет никаких результатов.

Префикс должен быть связан, чтобы предотвратить неоднозначность при запросе документов с некоторыми узлами, находящимися вне пространства имен, и некоторыми в пространстве имен по умолчанию.

Следующий код определяет префикс для пространства имен по умолчанию и выбирает все 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);  

См. также