Visual C# を使用して XML データを URL から読み取る方法


Visual Basic .NET については、次の資料を参照してください。301232


この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.Xml

この資料の内容

概要


この資料は XmlTextReader クラスを使用して XML (Extensible Markup Language) を URL (Uniform Resource Locator) から読み取る方法を説明しています。 ストリーム形式の情報を、サーバー、ファイル、または TextReader クラスからのバイト ストリームのような多種多様なソースから入手できます。

必要条件


必要なハードウェア、ソフトウェア、ネットワーク インフラストラクチャ、および Service Pack は、次のとおりです。

  • Microsoft Visual Studio
この資料は、次のトピックについて詳しい知識のあるユーザーを対象としています。

  • XML の用語
  • XML の作成と読み取り
  • URL と XML エンドポイントの作成

URL から XML データを読み取る方法

この例では、Books.xml と名前が付けられたファイルを使います。 独自に作成した Books.xml ファイルや、.NET SDK (Software Development Kit) の QuickStarts に含まれているサンプル ファイルを使用できます。 また、このファイルをダウンロードすることもできます。ダウンロードの場所についてはこの資料の「関連情報」の最初の項目を参照してください。

  1. Books.xml ファイルをコンピュータの \Inetpub\Wwwroot フォルダにコピーします。
  2. Visual Studio を起動します。
  3. 新しい Visual C# コンソール アプリケーションを作成します。 「完全なコード リスト 」に進むか、以下の手順に従ってアプリケーションを ビルドできます 。
  4. コード内で XmlTextReader クラス宣言を修飾する必要がないように System.Xml 名前空間に using ディレクティブを指定します。 using ディレクティブはすべての宣言の前に使用する必要があります。
    using System.Xml;
  5. URL を使用して XML ストリームを取得します。 ストリームはデバイスとは無関係に使用されます。そのため、ストリームのソースが変更されてもプログラムを変更する必要はありません。 http://localhost/books.xml という URL の定数を宣言します。 この次の手順の XmlTextReader でこの定数を使用します。 次のコード サンプルをデフォルトのクラスの Main プロシージャに追加します。
    String URLString = " http://localhost/books.xml";
  6. XmlTextReader クラスのインスタンスを作成して URL を指定します。 一般的に、XmlTextReader は DOM (Document Object Model) のオーバーヘッドなしに、未加工のデータとして XML にアクセスする必要がある場合に使用します。そのため、XmlTextReader は XML を読み取るための、高速なメカニズムを提供します。 XmlTextReader クラスには、XML データの場所を指定するためのさまざまなコンストラクターがあります。 次のコードは XmlTextReader オブジェクトのインスタンスを作成してコンストラクタにその URL を渡しています。
    XmlTextReader reader = new XmlTextReader (URLString);
  7. XML を完全に読み取ります。 (この手順では基本となる外側の "while" ループについて説明し、次の 2 つの手順は XML でのループと XML を読み取る方法について説明していることに注意してください。) XML が読み込まれた後、XmlTextReader は XML データ内を順番に移動し、Read メソッドを使用して次のレコードを読み取ります。 次に読み取るデータがない場合、Read メソッドは false を返します。
    while (reader.Read()) 
    {
    // Do some work here on the data.
    Console.WriteLine(reader.Name);
    }
    Console.ReadLine();
  8. ノーズを調べます。 XML データを処理するために、各レコードには NodeType プロパティから識別できるノード タイプがあります。 Name プロパティと Value プロパティは、現在のノード (またはレコード) のノード名 (要素名と属性名) とノード値 (ノード テキスト) を返します。 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;
    }
    }
  9. 属性を調べます。 要素のノード タイプに、関連する属性ノードの一覧が含まれている可能性があります。 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;
    }
    }
  10. プロジェクトをビルドして実行します。

完全なコード リスト

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' のハンドルされていない例外が system.xml.dll で発生しました。追加情報: 予期しない XML 宣言。 XML 宣言は、ドキュメントの最初のノードである必要があり、この前に空白文字が表示されることは許可されません。 行 1、位置 4。
この例外エラーは、コードの次の行で発生します。
while (reader.Read())

例外エラーを解決するには、Books.xml ドキュメントの最初のノードの前にある空白文字を削除します。

関連情報


次のファイルは、Microsoft ダウンロード センターからダウンロードできます。
詳細については、"XML in .NET: .NET Framework XML Classes and C# Offer Simple, Scalable Data Manipulation" (マイクロソフトの Web サイトで MSDN Magazine の資料) を参照してください。
XmlReader クラスの詳細については、次のマイクロソフトの .NET Framework Class Library のドキュメントを参照してください。