次の方法で共有


XPath クエリと名前空間

XPath クエリは XML ドキュメント内の名前空間を認識し、名前空間プレフィックスを使用して要素名と属性名を修飾できます。 名前空間プレフィックスを持つ要素名と属性名を修飾すると、XPath クエリによって返されるノードは、特定の名前空間に属するノードのみに制限されます。

たとえば、プレフィックスbooksが名前空間http://www.contoso.com/booksにマップされている場合、次の XPath クエリ/books:books/books:bookは、名前空間http://www.contoso.com/books内のbook要素のみを選択します。

The XmlNamespaceManager

XPath クエリで名前空間を使用するには、XmlNamespaceManager クラスなどのIXmlNamespaceResolver インターフェイスから派生したオブジェクトが、XPath クエリに含める名前空間 URI とプレフィックスを使用して構築されます。

XmlNamespaceManager オブジェクトは、次の各方法でクエリで使用できます。

IXmlNamespaceResolver インターフェイスから派生したオブジェクトをパラメーターとして受け入れるXPathNavigator クラスのメソッドを次に示します。

既定の名前空間

次の 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 は結果を返しません。

名前空間にないノードと既定の名前空間内の一部のノードを使用してドキュメントに対してクエリを実行する際にあいまいさを防ぐために、プレフィックスをバインドする必要があります。

次のコードでは、既定の名前空間のプレフィックスを定義し、http://www.contoso.com/books名前空間からすべてのbook要素を選択します。

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);  

こちらも参照ください