連載 .NETで簡単XML 第3回 XML文書を読み書きするプログラムの作成 |
XML文書を読み書きするサンプル
前回と今回で説明した知識を総合的に活用するために、簡単な情報の入力と読み書きを行うフォームを作成してみよう。ここではXML文書の読み書きがテーマなので、それ以外の部分は大胆に単純化してある。取りあえず、次のような画面のWindowsアプリケーションを作成してみよう。以下、ユーザー・インターフェイス関係のソース・コードは掲載を割愛している。
XML文書を読み書きするサンプル・フォーム |
この画面の「書き込み」と「読み込み」のボタンを押すと、以下のようなXML文書を決められたファイル名で入出力するようにしてみよう。
|
|
入出力されるXML文書 |
この文書を読み書きするためのReadメソッドとWriteメソッドを備えるPersonクラスを作成した。以下がその内容である。
|
|
サンプル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」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|