XpathNavigator を使用した XML データの抽出
更新 : November 2007
Microsoft .NET Framework において XML ドキュメントを表現する方法はいくつかあります。これには、String を使用する方法、または XmlReader、XmlWriter、XmlDocument、XPathDocument クラスを使用する方法があります。XML ドキュメントの異なる表現の間での移行を容易にするため、XPathNavigator クラスは、String, XmlReader オブジェクトまたは XmlWriter オブジェクトとして XML を抽出するためのメソッドおよびプロパティを多数提供しています。
XPathNavigator から文字列への変換
XPathNavigator クラスの OuterXml プロパティは、XML ドキュメント全体のマークアップ、または 1 つのノードとその子ノードのマークアップだけを取得するために使用されます。
メモ : |
---|
InnerXml プロパティは、ノードの子ノードのマークアップだけを取得します。 |
以下は、1 つのノードとその子ノードを保存する方法と、XPathNavigator オブジェクトに含まれる XML ドキュメント全体を String として保存する方法について説明するサンプル コードです。
Dim document As XPathDocument = New XPathDocument("input.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Save the entire input.xml document to a string.
Dim xml As String = navigator.OuterXml
' Now save the Root element and its child nodes to a string.
navigator.MoveToChild(XPathNodeType.Element)
Dim root As String = navigator.OuterXml
XPathDocument document = new XPathDocument("input.xml");
XPathNavigator navigator = document.CreateNavigator();
// Save the entire input.xml document to a string.
string xml = navigator.OuterXml;
// Now save the Root element and its child nodes to a string.
navigator.MoveToChild(XPathNodeType.Element);
string root = navigator.OuterXml;
XPathNavigator から XmlReader への変換
ReadSubtree メソッドは、XML ドキュメントのコンテンツ全体、または 1 つのノードとその子ノードを XmlReader オブジェクトにストリーム出力するために使用されます。
XmlReader オブジェクトが現在のノードとその子で作成されている場合、XmlReader オブジェクトの ReadState プロパティは Initial に設定されます。XmlReader オブジェクトの Read メソッドが最初に呼び出されるとき、XmlReader は XPathNavigator の現在ノードに移動されます。新しい XmlReader オブジェクトは、XML ツリーの終わりまで読み取りを継続します。この時点で、Read メソッドは false を返し、XmlReader オブジェクトの ReadState プロパティは EndOfFile に設定されます。
XPathNavigator オブジェクトの位置は、XmlReader オブジェクトの作成または移動によって変更されことはありません。ReadSubtree メソッドは、要素ノードまたはルート ノードに位置している場合にだけ有効です。
1 つのノードとその子ノードを取得する方法と、XPathDocument オブジェクト内の XML ドキュメント全体を含む XmlReader オブジェクトを取得する方法の例を次に示します。
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Stream the entire XML document to the XmlReader.
Dim xml As XmlReader = navigator.ReadSubtree()
While xml.Read()
Console.WriteLine(xml.ReadInnerXml())
End While
xml.Close()
' Stream the book element and its child nodes to the XmlReader.
navigator.MoveToChild("bookstore", "")
navigator.MoveToChild("book", "")
Dim book As XmlReader = navigator.ReadSubtree()
While book.Read()
Console.WriteLine(book.ReadInnerXml())
End While
book.Close()
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Stream the entire XML document to the XmlReader.
XmlReader xml = navigator.ReadSubtree();
while (xml.Read())
{
Console.WriteLine(xml.ReadInnerXml());
}
xml.Close();
// Stream the book element and its child nodes to the XmlReader.
navigator.MoveToChild("bookstore", "");
navigator.MoveToChild("book", "");
XmlReader book = navigator.ReadSubtree();
while (book.Read())
{
Console.WriteLine(book.ReadInnerXml());
}
book.Close();
この例は、books.xml ファイルを入力として使用します。
<bookstore>
<book genre="autobiography" publicationdate="1981-03-22" ISBN="1-861003-11-0">
<title>The Autobiography of Benjamin Franklin</title>
<author>
<first-name>Benjamin</first-name>
<last-name>Franklin</last-name>
</author>
<price>8.99</price>
</book>
<book genre="novel" publicationdate="1967-11-17" ISBN="0-201-63361-2">
<title>The Confidence Man</title>
<author>
<first-name>Herman</first-name>
<last-name>Melville</last-name>
</author>
<price>11.99</price>
</book>
<book genre="philosophy" publicationdate="1991-02-15" ISBN="1-861001-57-6">
<title>The Gorgias</title>
<author>
<name>Plato</name>
</author>
<price>9.99</price>
</book>
</bookstore>
XPathNavigator から XmlWriter への変換
WriteSubtree メソッドは、XML ドキュメントのコンテンツ全体、または 1 つのノードとその子ノードを XmlWriter オブジェクトにストリーム出力するために使用されます。
XPathNavigator オブジェクトの位置は、XmlWriter オブジェクトの作成によって変更されことはありません。
1 つのノードとその子ノードを取得する方法と、XPathDocument オブジェクト内の XML ドキュメント全体を含む XmlWriter オブジェクトを取得する方法の例を次に示します。
Dim document As XPathDocument = New XPathDocument("books.xml")
Dim navigator As XPathNavigator = document.CreateNavigator()
' Stream the entire XML document to the XmlWriter.
Dim xml As XmlWriter = XmlWriter.Create("newbooks.xml")
navigator.WriteSubtree(xml)
xml.Close()
' Stream the book element and its child nodes to the XmlWriter.
navigator.MoveToChild("bookstore", "")
navigator.MoveToChild("book", "")
Dim book As XmlWriter = XmlWriter.Create("book.xml")
navigator.WriteSubtree(book)
book.Close()
XPathDocument document = new XPathDocument("books.xml");
XPathNavigator navigator = document.CreateNavigator();
// Stream the entire XML document to the XmlWriter.
XmlWriter xml = XmlWriter.Create("newbooks.xml");
navigator.WriteSubtree(xml);
xml.Close();
// Stream the book element and its child nodes to the XmlWriter.
navigator.MoveToChild("bookstore", "");
navigator.MoveToChild("book", "");
XmlWriter book = XmlWriter.Create("book.xml");
navigator.WriteSubtree(book);
book.Close();
この例は、このトピックの前の方にある books.xml ファイルを入力として使用します。
参照
概念
XPathNavigator を使用するノード セットのナビゲーション
XPathNavigator を使用する属性と名前空間のナビゲーション
厳密に型指定された XML データへの XPathNavigator を使用したアクセス