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