XPath クエリおよび名前空間

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

たとえば、プレフィックス books が名前空間 http://www.contoso.com/books に割り当てられると、XPath クエリ /books:books/books:book は名前空間 book 内の http://www.contoso.com/books 要素だけを選択します。

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

関連項目