連載

.NETで簡単XML

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

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

Page1 Page2 Page3 Page4 Page5

XML文書を読み書きするサンプル

 前回と今回で説明した知識を総合的に活用するために、簡単な情報の入力と読み書きを行うフォームを作成してみよう。ここではXML文書の読み書きがテーマなので、それ以外の部分は大胆に単純化してある。取りあえず、次のような画面のWindowsアプリケーションを作成してみよう。以下、ユーザー・インターフェイス関係のソース・コードは掲載を割愛している。

XML文書を読み書きするサンプル・フォーム

 この画面の「書き込み」と「読み込み」のボタンを押すと、以下のようなXML文書を決められたファイル名で入出力するようにしてみよう。

<?xml version="1.0" encoding="utf-8"?>
<person id="0096" xmlns="http://www.atmarkit.co.jp/ns/sample/person/">
<name>山田九郎</name>
<age>19</age>
</person>
入出力されるXML文書

 この文書を読み書きするためのReadメソッドとWriteメソッドを備えるPersonクラスを作成した。以下がその内容である。

Imports System.Xml

Public Class Person
  Private _id As String = ""
  Private _name As String = ""
  Private _age As Integer = 0

  Public Property ID() As String
    Get
      Return _id
    End Get
    Set(ByVal Value As String)
      _id = Value
    End Set
  End Property

  Public Property Name() As String
    Get
      Return _name
    End Get
    Set(ByVal Value As String)
      _name = Value
    End Set
  End Property

  Public Property Age() As Integer
    Get
      Return _age
    End Get
    Set(ByVal Value As Integer)
      _age = Value
    End Set
  End Property

  Dim ns As String = "http://www.atmarkit.co.jp/ns/sample/person/"

  Public Sub Read(ByVal reader As XmlReader)
    reader.Read()
    While Not reader.EOF
      If reader.IsStartElement("person", ns) Then
        ID = reader.GetAttribute("id")
      End If

      If reader.IsStartElement("name", ns) Then
        Name = reader.ReadElementString("name", ns)
      ElseIf (reader.IsStartElement("age", ns)) Then
        Age = Integer.Parse(reader.ReadElementString("age", ns))
      Else
        reader.Read()
      End If
    End While
  End Sub

  Public Sub Write(ByVal writer As XmlWriter)
    writer.WriteStartDocument()
    writer.WriteWhitespace(Chr(13) & Chr(10))
    writer.WriteStartElement("person", ns)
    writer.WriteAttributeString("id", ID)
    writer.WriteString(Chr(13) & Chr(10))
    writer.WriteElementString("name", ns, Name)
    writer.WriteString(Chr(13) & Chr(10))
    writer.WriteElementString("age", ns, Age.ToString())
    writer.WriteString(Chr(13) & Chr(10))
    writer.WriteEndElement()
    writer.WriteWhitespace(Chr(13) & Chr(10))
    writer.WriteEndDocument()
  End Sub

End Class
サンプルXML文書を扱うPersonクラス(VB.NET版)
サンプルXML文書を扱うPersonクラス(C#版)

 このクラスでポイントになるのは、XML文書を読み込むReadメソッドと、書き出すWriteメソッドである。両者共に、引数にXmlTextWriterなどの実際に動作するクラスではなく、XmlReader/XmlWriterのような抽象クラスを使用している点にもちらっと目をやってほしい。当たり前の話だが、こういうコーディングをしておけば、異なる対象を入出力する用途に使うのが容易になる。

 まず末尾にあるWriteメソッドを見てみよう。このメソッドの内容は、すでに説明した知識で難なく理解できるだろう。このメソッドで注意することは、読みやすくするために入れた改行についてである。WriteStringメソッドで出力できるのは、最上位の要素の内側だけである。その外側ではWriteWhitespaceメソッドを使わねばならない。また、WriteStringメソッドを使って出力した改行は、文字データの一部として認識されるので、文字データそのものと混ぜるような使い方をするとトラブルの元である。例えば、このプログラムでは、「<name>山田九郎</name>」という行を出力しているが、これをちょっと読みやすくしようと、「山田九郎」の前後に改行を入れたりすると、name要素の内容は「山田九郎」ではなく「改行+山田九郎+改行」という文字列になってしまうのである。

 ちなみに、前回および今回では使用しなかったが、XmlTextWriterクラスにはFormattingというプロパティが用意されている。最終的にXML文書を人間が読みやすい形で出力するのであれば、あらかじめこれにFormatting.Indentedを指定しておいても、ある程度インデントや改行されたXML文書を得ることができる。しかし、こうして挿入した改行や空白も、読み込むときには空白文字として認識されることに注意する必要がある。

 次に、PersonクラスのReadメソッドを見てみよう。このメソッドは、先ほど紹介したXML文書読み込みのサンプル・プログラムとはかなり雰囲気が違っている。こういう書き方も可能ということで、違う書き方にしてみた。ここでは、IsStartElementメソッドで要素の開始を判定し、ReadElementStringメソッドで要素内容のテキストを取得するようにしている。

 このクラスのReadメソッドで最も重要なポイントは、実はIsStartElementメソッドとReadElementStringメソッドではなく、XmlReaderクラスのReadメソッドを呼び出している部分(reader.Read()の行)である。ここではループに入る前と、IsStartElementメソッドがすべてfalseであったときに、XmlReaderクラスのReadメソッドを呼び出している。このような形になっている理由を慎重に理解しておく必要がある。


 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 記事ランキング

本日 月間