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 オブジェクトは、次の各方法でクエリで使用できます。
XmlNamespaceManager オブジェクトは、XPathExpression オブジェクトの SetContext メソッドを使用して、既存のXPathExpression オブジェクトに関連付けられます。 XPath 式とXmlNamespaceManager オブジェクトを表す文字列をパラメーターとして受け取り、新しいXPathExpression オブジェクトを返す静的Compile メソッドを使用して、新しいXPathExpression オブジェクトをコンパイルすることもできます。
XmlNamespaceManager オブジェクト自体は、XPath 式を表す文字列と共に、受け入れるXPathNavigator クラス メソッドにパラメーターとして渡されます。
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);
こちらも参照ください
.NET