XPath 查询和命名空间

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 查询中使用以下每种方法来使用该对象。

以下是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);  

另请参阅