Visual C# を使用して URL から XML データを読み取る
この記事では、 クラスを使用して URL から XML を XmlTextReader
読み取る方法について説明します。 ストリーミングされた情報は、サーバー、ファイル TextReader
、クラスからのバイト ストリームなど、あらゆる種類のソースから取得できます。
元の製品バージョン: Visual Studio
元の KB 番号: 307643
要件
この記事では、次のトピックについて理解していることを前提としています。
- Microsoft Visual Studio
- XML 用語
- XML の作成と読み取り
- URL と XML エンドポイントの作成
この記事では、.NET Framework クラス ライブラリ名前空間 を参照しますSystem.Xml
。
URL から XML データを読み取る方法
この例では、 という名前のファイル Books.xml使用します。 独自の Books.xml ファイルを作成することも、.NET Software Development Kit (SDK) クイック スタートに含まれているサンプル ファイルを使用することもできます。 このファイルはダウンロードすることもできます。ダウンロード場所については、この記事の 「参照」 セクションの最初の項目を参照してください。
Books.xml ファイルをコンピューター上の
\Inetpub\Wwwroot
フォルダーにコピーします。Visual Studio を開きます。
新しい Visual C# コンソール アプリケーションを作成します。 [ コード一覧の完了 ] セクションに進むか、次の手順を続行してアプリケーションをビルドできます。
コードの後半でクラス宣言を
System.Xml
修飾XmlTextReader
する必要がないように、名前空間に using ディレクティブを指定します。 他の宣言の前に using ディレクティブを使用する必要があります。using System.Xml;
URL を使用して XML ストリームを取得します。 ストリームは、デバイスからの独立性を提供するために使用されます。そのため、ストリームのソースが変更された場合、プログラムの変更は必要ありません。 URL の定数を
http://localhost/books.xml
宣言します。 次の手順XmlTextReader
では、 で 定数を使用します。 次のコード サンプルを既定のクラスのメイン プロシージャに追加します。String URLString = "http://localhost/books.xml";
クラスのインスタンスを
XmlTextReader
作成し、URL を指定します。 通常は、XmlTextReader
ドキュメント オブジェクト モデル (DOM) のオーバーヘッドなしで XML に生データとしてアクセスする必要がある場合に使用されます。そのため、XmlTextReader
XML を読み取るためのメカニズムが高速になります。 クラスにはXmlTextReader
、XML データの場所を指定するためのさまざまなコンストラクターがあります。 次のコードでは、オブジェクトのインスタンスをXmlTextReader
作成し、URL をコンストラクターに渡します。XmlTextReader reader = new XmlTextReader (URLString);
XML を読み取る。
注:
この手順では、基本的な外部
while
ループを示し、次の 2 つの手順では、そのループを使用して XML を読み取る方法について説明します。読み込まれた後、
XmlTextReader
連続した読み取りを実行して XML データ間を移動し、 メソッドをRead
使用して次のレコードを取得します。 これ以上レコードがない場合、メソッドはRead
false を返します。while (reader.Read()) { // Do some work here on the data. Console.WriteLine(reader.Name); } Console.ReadLine();
ノードを検査します。 XML データを処理するために、各レコードには、 プロパティから決定できるノードの種類があります
NodeType
。 プロパティとValue
プロパティはName
、現在のノード (またはレコード) のノード名 (要素と属性名) とノード値 (ノード テキスト) を返します。NodeType
列挙はノードの種類を決定します。 次のサンプル コードでは、要素の名前とドキュメントの種類が表示されます。注:
この例では、要素属性を無視します。
while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // The node is an element. Console.Write("<" + 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("</" + reader.Name); Console.WriteLine(">"); break; } }
属性を調べます。 要素ノードの種類には、それらに関連付けられている属性ノードの一覧を含めることができます。 メソッドは
MovetoNextAttribute
、 要素内の各属性を順番に移動します。 ノードにHasAttributes
属性があるかどうかをテストするには、 プロパティを使用します。 プロパティはAttributeCount
、現在のノードの属性の数を返します。while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.Element: // The node is an element. Console.Write("<" + reader.Name); while (reader.MoveToNextAttribute()) // Read the attributes. Console.Write(" " + reader.Name + "='" + reader.Value + "'"); Console.Write(">"); 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("</" + reader.Name); Console.WriteLine(">"); break; } }
プロジェクトをビルドして実行します。
完全なコード一覧
using System;
using System.Xml;
namespace ReadXMLfromURL
{
/// <summary>
/// Summary description for Class1.
/// </summary>
class Class1
{
static void Main(string[] args)
{
String URLString = "http://localhost/books.xml";
XmlTextReader reader = new XmlTextReader (URLString);
while (reader.Read())
{
switch (reader.NodeType)
{
case XmlNodeType.Element: // The node is an element.
Console.Write("<" + reader.Name);
while (reader.MoveToNextAttribute()) // Read the attributes.
Console.Write(" " + reader.Name + "='" + reader.Value + "'");
Console.Write(">");
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("</" + reader.Name);
Console.WriteLine(">");
break;
}
}
}
}
}
出力例
<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 は、追加情報: 予期しない XML 宣言 system.xml.dll で発生しました。 XML 宣言はドキュメント内の最初のノードである必要があり、その前に空白文字を表示することはできません。 行 1、位置 4。
例外エラーは、次のコード行で発生します。
while (reader.Read())
例外エラーを解決するには、 Books.xml ドキュメントの最初のノードの前にある空白文字を削除します。