XPath 查詢知道 XML 檔中的命名空間,而且可以使用命名空間前置詞來限定專案和屬性名稱。 具有命名空間前置詞的限定專案和屬性名稱,會將 XPath 查詢傳回的節點限製為僅屬於特定命名空間的節點。
例如,如果前置詞books對應至命名空間http://www.contoso.com/books,則下列 XPath 查詢/books:books/books:book只會選取命名空間 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 檔的前置詞,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);