連載

.NETで簡単XML

第3回 XML文書を読み書きするプログラムの作成

株式会社ピーデー 川俣 晶
2003/04/08

Page1 Page2 Page3 Page4 Page5


Back Issue
1
XML超入門
2 プログラムでXML文書を作成する

XML文書を読み込む

 第2回 プログラムでXML文書を作成するでは、XML文書を書き出すプログラムを作成した。そこで、今回は読み込みに挑戦してみよう。XML文書を読み込む方法はいくつかあるが、今回はXmlReaderを使用する。

 XML文書を読み込むプログラムは、書き出すプログラムに比べると作るのが難しい。なぜなら、書き出すときには項目の並び順をプログラム側で強制できるのに対して、既存のXML文書を読み込む際には、どんな項目がどんな順番で並んでいるのか、あらゆる可能性を考えなければならないからだ。これを回避するためには、スキーマを使って、並び順の妥当性を確認するという方法もあるが、ここではスキーマを使わないという前提で話を進めよう。

 さて、XML文書を出力するために前回紹介したXmlTextWriterクラスがあったのと同じように、読み込み用のXmlTextReaderクラスも存在する。このクラスは、ファイル、ストリーム、テキストなどからXML文書を入力する機能を持つ。処理する順番は、XmlTextWriterクラスと同様に、前方から後方に向かって一直線(シーケンシャル)である。処理の流れを変えることはできない。このクラスは、抽象クラスのXmlReaderクラスに、それらの対象からの入力機能を実装したものである。もし、何か別の対象から入力したい場合は、XmlReaderクラスを継承して入力機能を実装すればよいことになる。それは応用技ということで話をXmlTextReaderクラスに戻そう。

 XmlTextReaderクラスには、XML文書に記録されているさまざまな項目、要素や属性などを読み込むメソッドが用意されている。しかし、それだけで十分というわけではなく、種類を問わず次の項目を読み込むReadメソッドが存在している。Readメソッドで次の項目を読み込んでから、その項目が何かを判定して、処理すべき内容を決定するプログラミングを行うことが多い。

 さて、いろいろな種類の項目が読み込まれて分類される様子を確認するために、サンプル・プログラムを用意した。条件を変えて何度も繰り返し試すために、以下に示すようなGUIのインターフェイスを用意しよう。

 まず、Windowsアプリケーションのフォーム上に、マルチラインのTextBoxコントロール(MultilineプロパティをTrueに設定)を2つと、Buttonコントロールを1つ貼り付けよう。Labelコントロールなどは好みに応じて適当に付ければよい。各コントロールには次のような名前を設定する。

上のTextBoxコントロール:textBoxSource
下のTextBoxコントロール:textBoxResult
Buttonコントロール:buttonDump

 Visual Studio .NETでの配置は、次のような感じである。

GUIインターフェイスのデザイン例
このサンプル・プログラムは、さまざまなXML文書を読み込んで、その処理結果を確認するのに利用する。

 フォームができたら、コードの先頭部分に、以下のようにImportsステートメント(C#ではusingディレクティブ)を追加する。

Imports System.IO
Imports System.Xml
VB.NET版のサンプルに必要なImportsステートメント
C#版のサンプルに必要なusingディレクティブ

 そして、いま配置したButtonコントロールをダブルクリックし、ボタンのClickイベントとして以下のようなコード書き込む。

  Private Sub buttonDump_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles buttonDump.Click
    Dim writer As StringWriter = New StringWriter()
    Try
      Dim reader As XmlTextReader = New XmlTextReader(New StringReader(textBoxSource.Text))
      Try
        While reader.Read()
          writer.WriteLine("ノードを発見: {0}", reader.NodeType.ToString())

          Select Case reader.NodeType
            Case XmlNodeType.Element
              writer.WriteLine("reader.Name={0}", reader.Name)

              If reader.MoveToFirstAttribute() Then
                Do
                  writer.WriteLine("属性を発見 {0}={1}", reader.Name, reader.Value)
                Loop Until (Not reader.MoveToNextAttribute())
              End If
            Case XmlNodeType.Text
              writer.WriteLine("reader.Value={0}", reader.Value)
            Case XmlNodeType.EndElement
              writer.WriteLine("reader.Name={0}", reader.Name)
          End Select
        End While
      Catch ex As XmlException
        writer.WriteLine(ex.ToString())
      Finally
        reader.Close()
      End Try
    Finally
      writer.Close()
    End Try
    textBoxResult.Text = writer.ToString()
  End Sub
ボタンのClickイベントに記述するコード(VB.NET版)
ボタンのClickイベントに記述するコード(C#版)


 INDEX
  .NETで簡単XML
  第3回 XML文書を読み書きするプログラムの作成
  1.XML文書を読み込む
    2.XML文書を読み込むサンプル・プログラム
    3.文書の妥当性を検証するXmlValidatingReaderクラス
    4.XML文書を読み書きするサンプル
    5.XML文書を読み書きするサンプルの解説
 
インデックス・ページヘ  「連載 :.NETで簡単XML」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間