XPath クエリおよび名前空間
XPath クエリは XML ドキュメント中の名前空間を認識し、名前空間プレフィックスを使用して要素と属性名を修飾することができます。名前空間プレフィックスで要素や属性の名前を修飾すると、XPath クエリで返されるノードを特定の名前空間に属するノードだけに限定することができます。
たとえば、プレフィックス books が名前空間 https://www.contoso.com/books に割り当てられると、XPath クエリ /books:books/books:book は名前空間 https://www.contoso.com/books 内の book 要素だけを選択します。
XmlNamespaceManager
XPath クエリで名前空間を使用するために、XmlNamespaceManager クラスに似た IXmlNamespaceResolver インターフェイスから派生したオブジェクトが、名前空間 URI と XPath クエリに含まれるプレフィックスを使用して作成されます。
XmlNamespaceManager オブジェクトは次の方法でクエリで使用することができます。
XPathExpression オブジェクトの SetContext メソッドを使用して、XmlNamespaceManager オブジェクトを既存の XPathExpression オブジェクトに関連付ける。静的 Compile メソッドを使用して、新しい XPathExpression オブジェクトをコンパイルすることもできます。このメソッドは XPath 式を表す文字列と XmlNamespaceManager オブジェクトをパラメーターとして取り、新しい XPathExpression オブジェクトを返します。
XPath 式を表す文字列と共に XmlNamespaceManager オブジェクト自体をパラメーターとして受け入れ側の XPathNavigator クラス メソッドに渡す。
次は、IXmlNamespaceResolver インターフェイスから派生したオブジェクトをパラメーターとして受け付ける XPathNavigator クラスのメソッドです。
既定の名前空間
次の XML ドキュメントでは、https://www.contoso.com/books 名前空間を宣言するために、空のプレフィックスの既定の名前空間が使用されています。
<books xmlns="http://www.example.com/books">
<book>
<title>Title</title>
<author>Author Name</author>
<price>5.50</price>
</book>
</books>
XPath は空のプレフィックスを null 名前空間として取り扱います。つまり、XPath クエリでは、名前空間に割り当てられたプレフィックスだけを使用できます。このことは、XML ドキュメント内の名前空間に対してクエリする場合、たとえそれが既定の名前空間であっても、そのプレフィックスを定義する必要があることを意味します。
たとえば、上記の XML ドキュメントでプレフィックスを定義しなければ、XPath クエリ /books/book は何も結果を返しません。
ドキュメントで、名前空間内にないノードと既定の名前空間内のノードに対してクエリを行う場合には、あいまいさを避けるために、プレフィックスを付加しなければなりません。
次のコードは、既定の名前空間のプレフィックスを定義し、https://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", "https://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", "https://www.contoso.com/books");
query.SetContext(manager);
XPathNodeIterator nodes = navigator.Select(query);