XPath 查詢和命名空間
XPath 查詢可辨識 XML文件中的命名空間,並可使用命名空間前置詞來限定項目及屬性名稱。 使用命名空間前置詞限定項目及屬性名稱,會將 XPath 查詢傳回的節點限制為那些只屬於特定命名空間的節點。
例如,如果前置詞 books
對應命名空間 http://www.contoso.com/books
,則下列 XPath 查詢 /books:books/books:book
只會選取命名空間 book
中的那些 http://www.contoso.com/books
項目。
XmlNamespaceManager
若要在 XPath 查詢中使用命名空間,需使用要包含在該 XPath 查詢中的命名空間 URI 及前置詞,建構自 IXmlNamespaceResolver 介面衍生的物件,如 XmlNamespaceManager 類別。
可以透過下列每一種方式將 XmlNamespaceManager 物件用於查詢中。
可藉由使用 XmlNamespaceManager 物件的 XPathExpression 方法,使 SetContext 物件與現有 XPathExpression 物件產生關聯。 您也可使用靜態 XPathExpression 方法編譯新的 Compile 物件;該方法會採用表示 XPath 運算式的字串及 XmlNamespaceManager 物件做為參數,並傳回新的 XPathExpression 物件。
XmlNamespaceManager 物件本身會做為參數,連同表示 XPath 運算式的字串一起傳遞至接受的 XPathNavigator 類別方法。
下列是 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);