この記事では、 XmlTextReader クラスを使用してファイルから XML データを読み取る方法について説明します。
元の製品バージョン: Visual C++
元の KB 番号: 815658
まとめ
この記事では、 XmlTextReader クラスを使用してファイルから XML データを読み取る方法について説明します。 XmlTextReader クラスは、XML データの直接的な解析とトークン化を提供します。 XmlTextReader クラスは、名前空間に加えて、World Wide Web Consortium (W3C) によって定義されている XML 仕様に XML 1.0 仕様も実装します。 この記事では、XML ドキュメント オブジェクト モデル (DOM) などのオブジェクト モデルを使用する代わりに、XML データへの高速なトークン化ストリーム アクセスを行う方法について説明します。
この記事の Microsoft Visual C# .NET バージョンについては、「 Visual C#を使用してファイルから XML を読み取る方法」を参照してください。
この記事では、次の Microsoft .NET Framework クラス ライブラリ名前空間について説明します。 System.xml
要件
この記事では、次のトピックについて理解していることを前提としています。
- XML の用語
- XML ファイルを作成する方法と読み取る方法
次の一覧では、必要な推奨ハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、およびサービス パックの概要を示します。
- Microsoft Visual Studio .NET
- Microsoft Visual Studio 2005
ファイルから XML データを読み取る
この記事の例では、 Books.xmlという名前のファイルを使用します。 独自のBooks.xml ファイルを作成することも、Microsoft .NET Software Development Kit (SDK) クイック スタートに含まれているサンプル ファイルを使用することもできます。 Books.xml ファイルをプロジェクト フォルダーにコピーする必要があります。
ファイルから XML データを読み取る手順は次のとおりです。
Visual Studio .NET 2002、Visual Studio .NET 2003、または Visual Studio 2005 を起動します。
[ファイル] メニューの [新規作成] をポイントし、 [プロジェクト] をクリックします。
[新しいプロジェクト] ダイアログ ボックスが表示されます。
[ プロジェクトの種類で、 Visual C++ プロジェクト をクリックします。
Note
Visual Studio 2005 では、 Visual C++ プロジェクト が Visual C++ に変更されます。
Visual Studio .NET 2002 を使用している場合は、[ Templates で Managed C++ Application をクリックします。
Templates で、Visual Studio .NET 2003 を使用している場合は Console Application (.NET) をクリックします。
Templatesで、Visual Studio 2005 を使用している場合はCLR コンソール アプリケーションクリックします。
[ 名 ボックスに「 Q815658」と入力し、[ OK] をクリック。
プロジェクト内の
System.xml.dllへの参照を追加します。 マネージド Visual C++ プロジェクトへの参照を追加する方法の詳細については、「 マネージ Visual C++ プロジェクトへの参照の追加」を参照してください。System::Xml名前空間で using ディレクティブを次のように指定します。using namespace System::Xml;これは、後でコードで
XmlTextReaderクラス宣言を修飾する必要がないようにするために行います。 他の宣言の前に using ディレクティブを使用する必要があります。XmlTextReaderオブジェクトのインスタンスを作成します。XmlTextReaderオブジェクトに.xml ファイルを設定します。通常、
XmlTextReaderクラスは、DOM のオーバーヘッドなしで生の XML データにアクセスする必要がある場合に使用されます。 したがって、XmlTextReaderクラスを使用すると、XML データをより高速に読み取る方法が提供されます。XmlTextReaderクラスには、XML データの場所を指定する異なるconstructorsがあります。次のコードでは、
XmlTextReaderクラスのインスタンスを作成し、 Books.xml ファイルを読み込みます。_tmain関数に次のコードを追加します。XmlTextReader* reader = new XmlTextReader ("books.xml");Note
Visual C++ 2005 では、
_tmain関数が main 関数に変更されます。XML データを読み取る。
Note
この手順では、外側の ループを示します。 この手順に従う 2 つの手順では、 while ループを使用して XML データを読み取る方法を示します。
XmlTextReaderオブジェクトを作成したら、Read メソッドを使用して XML データを読み取ります。Read メソッドは、Read メソッドがファイルの末尾に達するまで、.xml ファイル内を順番に移動し続けます。 Read メソッドがファイルの末尾に達すると、Read メソッドは false を返します。
while (reader->Read()) { // Do some work here on the data. Console::WriteLine(reader->Name); }ノードを調べます。
XML データを処理するために、各レコードには、
NodeTypeプロパティから決定できるノードの種類があります。NameプロパティとValueプロパティは、現在のノードまたは現在のレコードに関する次の情報を返します。- 要素名と属性名であるノード名。
- ノード テキストであるノード値。
NodeType列挙は、ノードの種類を決定します。 次のコード サンプルでは、要素の名前とドキュメントの種類を表示します。 次のコード サンプルでは、要素属性は無視されます。while (reader->Read()) { switch (reader->NodeType) { case XmlNodeType::Element: // The node is an element. Console::Write("<{0}", reader->Name); Console::WriteLine(">"); break; case XmlNodeType::Text: //Display the text in each element. Console::WriteLine (reader->Value); break; case XmlNodeType::EndElement: //Display the end of the element. Console::Write("</{0}", reader->Name); Console::WriteLine(">"); break; } }属性を調べます。
要素ノードタイプには、要素ノードタイプに関連付けられた属性ノードのリストを含めることができます。
MovetoNextAttributeメソッドは、要素内の各属性を順番に移動します。HasAttributesプロパティを使用して、ノードに属性があるかどうかをテストします。AttributeCountプロパティは、現在のノードの属性の数を返します。while (reader->Read()) { switch (reader->NodeType) { case XmlNodeType::Element: // The node is an element. Console::Write("<{0}", reader->Name); while (reader->MoveToNextAttribute()) // Read the attributes. Console::Write(" {0}='{1}'", reader->Name, reader->Value); Console::WriteLine(">"); break; case XmlNodeType::Text: //Display the text in each element. Console::WriteLine (reader->Value); break; case XmlNodeType::EndElement: //Display the end of the element. Console::Write("</{0}", reader->Name); Console::WriteLine(">"); break; } }ソリューションを保存します。 ソリューションをビルドします。
Ctrl キーを押しながら F5 キーを押して、サンプル アプリケーションを実行します。
Visual Studio .NET 2002 または Visual Studio .NET 2003 で完全なコード一覧を表示する
#include "stdafx.h"
#include <tchar.h>
#using <mscorlib.dll>
#using <System.xml.dll>
using namespace System;
using namespace System::Xml;
void _tmain(void)
{
XmlTextReader* reader = new XmlTextReader ("books.xml");
while (reader->Read())
{
switch (reader->NodeType)
{
case XmlNodeType::Element: // The node is an element.
Console::Write("<{0}", reader->Name);
while (reader->MoveToNextAttribute()) // Read the attributes.
Console::Write(" {0}='{1}'", reader->Name, reader->Value);
Console::WriteLine(">");
break;
case XmlNodeType::Text: //Display the text in each element.
Console::WriteLine (reader->Value);
break;
case XmlNodeType::EndElement: //Display the end of the element.
Console::Write("</{0}", reader->Name);
Console::WriteLine(">");
break;
}
}
Console::ReadLine();
}
Note
前のコード サンプルを正常にコンパイルするには、Visual C++ 2005 で共通言語ランタイム サポート コンパイラ オプション (/clr:oldSyntax) を追加する必要があります。 Visual C++ 2005 で共通言語ランタイム サポート コンパイラ オプションを追加するには、次の手順に従います。
Project をクリックし、<ProjectName> プロパティをクリックします。
Note
<ProjectName> は、プロジェクトの名前のプレースホルダーです。
Configuration プロパティ展開し、General をクリックします。
右ペインの Common Language Runtime サポートプロジェクト設定で Common Language Runtime サポート、旧構文 (/clr:oldSyntax)を選択し、[ アプリケーション] をクリックし、[ OK] をクリックします。
共通言語ランタイム サポート コンパイラ オプションの詳細については、「 /clr (共通言語ランタイム コンパイル)」を参照してください。
これらの手順は、記事全体に適用されます。
サンプル出力を表示する
<bookstore>
<book genre='autobiography' publicationdate='1981' 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' 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' ISBN='1-861001-57-6'>
<title>
The Gorgias
</title>
<author>
<name>
Plato
</name>
</author>
<price>
9.99
</price>
</book>
</bookstore>
トラブルシューティング
サンプル アプリケーションを実行すると、次のエラー メッセージが表示されることがあります。
System.Xml.XmlException 型のハンドルされない例外が、System.xml.dll追加情報: システム エラーで発生しました。
関連情報
XmlReader を使用した XML の読み取りの詳細については、「xmlReader を使用した XML の読み取りを参照してください。