XPath ナビゲーションによるノードの選択Select Nodes Using XPath Navigation

XML ドキュメント オブジェクト モデル (DOM) には、DOM 内の情報を照会するための XPath (XML Path Language) ナビゲーションに使用できるメソッドが含まれています。The XML Document Object Model (DOM) contains methods that allow you to use XML Path Language (XPath) navigation to query information in the DOM. XPath を使用すると、特定の単一ノードを見つけたり、条件に一致するすべてのノードを検索したりできます。You can use XPath to find a single, specific node or to find all nodes that match some criteria.

XPath の選択メソッドXPath Select Methods

DOM クラスは、XPath による選択に、SelectSingleNode および SelectNodes という 2 つのメソッドを提供します。The DOM classes provide two methods for XPath selection: the SelectSingleNode method and the SelectNodes method. SelectSingleNode メソッドは、選択基準に一致した最初のノードを返します。The SelectSingleNode method returns the first node that matches the selection criteria. SelectNodes メソッドは、一致したノードを含む XmlNodeList を返します。The SelectNodes method returns an XmlNodeList that contains the matching nodes.

次の例では、SelectSingleNode メソッドを使用して、著者の姓が指定した条件と一致する最初の book ノードを選択しています。The following example uses the SelectSingleNode method to select the first book node in which the author's last name meets the specified criteria. bookstore.xml ファイル (このトピックの最後にあります) を入力ファイルとして使用します。The bookstore.xml file (which is provided at the end of this topic) is used as the input file.

Dim doc As New XmlDocument()  
doc.Load("bookstore.xml")  
Dim root As XmlNode = doc.DocumentElement  
  
' Add the namespace.  
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)  
nsmgr.AddNamespace("bk", "urn:newbooks-schema")  
  
' Select and display the first node in which the author's   
' last name is Kingsolver.  
Dim node As XmlNode = root.SelectSingleNode( _  
     "descendant::bk:book[bk:author/bk:last-name='Kingsolver']", nsmgr)  
Console.WriteLine(node.InnerXml)  
// Load the document and set the root element.  
XmlDocument doc = new XmlDocument();  
doc.Load("bookstore.xml");  
XmlNode root = doc.DocumentElement;  
  
// Add the namespace.  
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);  
nsmgr.AddNamespace("bk", "urn:newbooks-schema");  
  
// Select and display the first node in which the author's   
// last name is Kingsolver.  
XmlNode node = root.SelectSingleNode(  
    "descendant::bk:book[bk:author/bk:last-name='Kingsolver']", nsmgr);  
Console.WriteLine(node.InnerXml);  

次の例では、SelectNodes メソッドを使用して、指定した値より高い価格の book ノードをすべて選択しています。The next example uses the SelectNodes method to select all the book nodes in which the price is greater than a specified amount. その後、選択されたリストに含まれる各書籍の価格を、プログラムで 10% 安くしています。The price for each book in the selected list is then programmatically reduced by ten percent. 最後に、更新したファイルをコンソールに書き出します。Finally, the updated file is written to the console. bookstore.xml ファイル (このトピックの最後にあります) を入力ファイルとして使用します。The bookstore.xml file (which is provided at the end of this topic) is used as the input file.

' Load the document and set the root element.  
Dim doc As New XmlDocument()  
doc.Load("bookstore.xml")  
Dim root As XmlNode = doc.DocumentElement  
  
' Add the namespace.  
Dim nsmgr As New XmlNamespaceManager(doc.NameTable)  
nsmgr.AddNamespace("bk", "urn:newbooks-schema")  
  
' Select all nodes where the book price is greater than 10.00.  
Dim nodeList As XmlNodeList = root.SelectNodes( _  
     "descendant::bk:book[bk:price>10.00]", nsmgr)  
For Each book As XmlNode In nodeList  
     Dim price As Double  
     price = Math.Round(Convert.ToSingle( _  
          book.LastChild.InnerText) * 0.9, 2)  
     book.LastChild.InnerText = price.ToString()  
Next  
  
' Display the updated document.  
doc.Save(Console.Out)  
// Load the document and set the root element.  
XmlDocument doc = new XmlDocument();  
doc.Load("bookstore.xml");  
XmlNode root = doc.DocumentElement;  
  
// Add the namespace.  
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);  
nsmgr.AddNamespace("bk", "urn:newbooks-schema");  
  
// Select all nodes where the book price is greater than 10.00.  
XmlNodeList nodeList = root.SelectNodes(  
     "descendant::bk:book[bk:price>10.00]", nsmgr);  
foreach (XmlNode book in nodeList)  
{  
     // Discount prices by 10%.  
     double price;  
     price = Math.Round(Convert.ToSingle(  
          book.LastChild.InnerText) * 0.9, 2);  
     book.LastChild.InnerText = price.ToString();  
}  
  
// Display the updated document.  
doc.Save(Console.Out);  

上の例で、XPath クエリはドキュメント要素から開始されます。The examples above start the XPath query at the document element. XPath クエリの始点を設定すると、コンテキスト ノードが設定され、XPath クエリの開始点になります。Setting the starting point for the XPath query sets the context node, which is the starting point for the XPath query. ドキュメント要素からではなく、ドキュメント要素の最初の子から開始するには、次のように選択ステートメントを記述します。If you do not want to start at the document element, but want to start from the first child of the document element, you can code the select statement as follows:

doc.DocumentElement.FirstChild.SelectNodes(. . . )  
this doc.DocumentElement.FirstChild.SelectNodes(. . .);  

すべての XmlNodeList オブジェクトは、元のドキュメントに同期されます。All XmlNodeList objects are synchronized with the underlying document. そのため、ノード リストを反復処理してノードの値を変更すると、そのノードは元のドキュメントにおいても更新されます。Therefore, if you iterate through the node list and modify the value of a node, that node is also updated in the document it came from. 前の例で、選択した XmlNodeList でノードが変更されると、基になっているドキュメントも変更されることに注意してください。Notice in the previous example that when a node is modified in the selected XmlNodeList the underlying document is also modified.

注意

元のドキュメントが変更された場合は、選択を再実行するのが適切です。When the underlying document is modified, it is advisable to rerun the select. 変更されたノードが、以前はノード リストに含まれておらず、ノード リストに追加されるものであったり、ノード リストから削除されるものであったりした場合は、ノード リストの正確さは保証されなくなります。If the node modified is one that could cause the node to be added to the node list when it was not previously, or would now cause it to be removed from the node list, there is no guarantee that the node list is now accurate.

XPath 式の名前空間Namespaces in XPath Expressions

XPath 式は名前空間を含むことができます。XPath expressions can include namespaces. 名前空間の解決は XmlNamespaceManager を使用してサポートされます。Namespace resolution is supported using the XmlNamespaceManager. XPath 式にプレフィックスが含まれる場合は、プレフィックスと名前空間 URI のペアを XmlNamespaceManager に追加して、XmlNamespaceManagerSelectNodes(String, XmlNamespaceManager) メソッド、または SelectSingleNode(String, XmlNamespaceManager) メソッドに渡す必要があります。If the XPath expression includes a prefix, the prefix and namespace URI pair must be added to the XmlNamespaceManager, and the XmlNamespaceManager is passed to the SelectNodes(String, XmlNamespaceManager) or SelectSingleNode(String, XmlNamespaceManager) method. 前のコード例では、XmlNamespaceManager を使用して bookstore.xml ドキュメントの名前空間を解決しています。Notice that the code examples above use the XmlNamespaceManager to resolve the namespace of the bookstore.xml document.

注意

XPath 式にプレフィックスが含まれない場合は、名前空間 URI は空の名前空間であると仮定されます。If the XPath expression does not include a prefix, it is assumed that the namespace Uniform Resource Identifier (URI) is the empty namespace. XML に既定の名前空間が含まれる場合でも、プレフィックスと名前空間 URI を XmlNamespaceManager に追加する必要があります。そうしないと、ノードは選択されません。If your XML includes a default namespace, you must still add a prefix and namespace URI to the XmlNamespaceManager; otherwise, no nodes will be selected.

入力ファイルInput File

次に示すのは、このトピックの例で入力ファイルとして使用している bookstore.xml ファイルです。The following is the bookstore.xml file that is used as the input file in the examples in this topic:

<?xml version='1.0'?>  
<bookstore xmlns="urn:newbooks-schema">  
  <book genre="novel" style="hardcover">  
    <title>The Handmaid's Tale</title>  
    <author>  
      <first-name>Margaret</first-name>  
      <last-name>Atwood</last-name>  
    </author>  
    <price>19.95</price>  
  </book>  
  <book genre="novel" style="other">  
    <title>The Poisonwood Bible</title>  
    <author>  
      <first-name>Barbara</first-name>  
      <last-name>Kingsolver</last-name>  
    </author>  
    <price>11.99</price>  
  </book>  
  <book genre="novel" style="paperback">  
    <title>The Bean Trees</title>  
    <author>  
      <first-name>Barbara</first-name>  
      <last-name>Kingsolver</last-name>  
    </author>  
    <price>5.99</price>  
  </book>  
</bookstore>  

関連項目See also