XPath 查询知道 XML 文档中的命名空间,并且可以使用命名空间前缀来限定元素和属性名称。 限定具有命名空间前缀的元素和属性名称将 XPath 查询返回的节点限制为仅那些属于特定命名空间的节点。
例如,如果前缀books
映射到命名空间http://www.contoso.com/books
,则以下 XPath 查询/books:books/books:book
仅选择命名空间http://www.contoso.com/books
中的这些book
元素。
The XmlNamespaceManager
若要在 XPath 查询中使用命名空间,需要将接口中派生出来的 IXmlNamespaceResolver 对象(如 XmlNamespaceManager 类)与命名空间 URI 及前缀一起构建,以便包含在 XPath 查询中。
可以在 XmlNamespaceManager 查询中使用以下每种方法来使用该对象。
该XmlNamespaceManager对象通过XPathExpression对象的方法SetContext与现有的XPathExpression对象相关联。 还可以使用静态Compile方法编译一个新XPathExpression对象,该方法采用表示 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);