連載

.NETで簡単XML

第15回 川俣流XMLプログラミングの定石(1)

株式会社ピーデー 川俣 晶
2004/03/06

XML文書の読み書きにどの方法を使うか

 XML文書の読み書きをするためには、いくつかの方法がある。ここでは具体的なメリット、デメリットを交え、実戦的な観点から整理してみよう。

■テキスト・ファイルとして読み書き

 XML文書は一種のテキスト・ファイルなので、テキスト・ファイルを読み書きする機能を通して、XML文書の読み書きを行うことができる。実際に、XMLを扱う機能が標準ライブラリに含まれないケースでは、この方法はしばしば使われる。しかし、.NET Frameworkの標準ライブラリには含まれるため、あえてこれを使うメリットは少ない。

 この方法を採用するか否かは、読み込みと書き込みに分けて考える必要がある。読み込みのケースで、XML文書をテキスト・ファイルとして読み込む選択は、ほとんどメリットが見い出せない。なぜなら、一見簡単に見えるXML文書にも、細かく多数の決まり事があり、すべての正しいXML文書を読み込むようにプログラミングを行うのは手間が掛かりすぎるためだ。どれぐらいの手間が掛かるかは、やさしく読む「XML 1.0勧告」の連載を読んで想像していただきたい。

 一方、書き込みの場合は、この方法が採用されることがある。書き込みの場合は、出力されたXML文書が正しいXML文書になっているだけでよく、あらゆるXML文書に対応する必要はない。つまり、取り組む難度や手間は低いものになる。テキスト・エディタでXML文書を記述できるプログラマなら、容易にこの方法でプログラミングすることができるだろう。難しく考えすぎて、「XML文書を出力する方法を教えてください」という質問をするビギナーがよくいるが、出力したいXML文書をそのとおりテキスト・ファイルとして書き込む(各要素や内容を一連の文字列として書き込む)だけで目的は達成できる。

 ここで1つだけ注意すべきことは、テキスト・ファイルとして出力する方法は手軽ではあるが、最も手軽であるかどうかは、検討を要するところである。確かに、少し前まで多かったDOMとSAX(この連載では紹介していない)をサポートしたXMLプロセッサを使ってXML文書を読み書きするプログラムを作成する場合においては、最も手軽にXML文書を出力する方法は、テキスト・ファイルとして出力する方法だった。DOMはXML文書を出力する機能を持つが、いちいちツリーを構築してから出力する必要があるため、回りくどい。かといって、SAXのサポートは読み込み専用であるため、書き込みには使えない。そこで、テキスト・ファイルとして出力する方法が最も手軽であったわけだ。

 しかし、.NET Frameworkの場合は、いろいろなXML文書の出力機能が用意されている。例えば、手軽にXML文書を出力するのに使用できるXmlWriterクラスなどが存在する。では、テキスト・ファイルと、XmlWriterクラスのどちらを使う方がより手軽かというと、それはXmlWriterクラスであると筆者は考える。XmlWriterクラスを使うと、細かい構文を正しく出力する機能を、クラス内で肩代わりしてくれる。例えば1文字も間違わないで正しいXML宣言を出力するためには、テキスト・ファイルの場合はプログラマ自身が1文字たりとも間違わないように注意しながらプログラムを作成する必要がある。しかし、XmlWriterクラスを使えば、ただ単にXML宣言を出力するメソッドを呼び出すだけでよく、より手軽である。

■DOM

 DOMはXML文書を扱う上で最強の方法といえるかもしれない。どのようなXML文書でも読み込むことができ、その内容を変更することも、さまざまな方法で内部のデータを取り出すこともできる。DOMは最強の万能ツールに最も近いといえるだろう。しかし、その自由度の高さと高機能さは、資源を浪費し、扱う手間も煩雑になるというデメリットももたらしている。DOMが消費する資源が、利用できる資源を超えてしまうケースでは、DOMを使うことができない。例えば、仮想記憶を含めてメモリが512Mbytesしかないパソコンで、1GbytesのXML文書を通常のDOMによって扱うことはできない。このようなケースでは、DOMではなく、XmlReader/XmlWriterクラスのように少ないメモリでXML文書を扱える機能を選択する必要がある。また、処理速度の問題から、DOMよりもXmlReader/XmlWriterクラスのような軽い機能を選ぶべきケースもある。

 しかし、ほかのケースでは必ずDOMを使うべきとも言い難く、選択は微妙である。個々のケースごとにメリットとデメリットを比較しながら判断する必要がある。

■XmlReader/XmlWriterクラス

 XmlReader/XmlWriterクラスは、シンプルで軽量というメリットがあるが、そのほかの部分では極めて制約の多いものである。しかし、コーディングの手間さえ惜しまなければ、あらゆるXML文書に対して、あらゆる操作が可能という意味で、一種の万能ツールということもできる。DOMも万能ツールという点では同じだが、性格付けがまったく異なるので、使い分ける価値がある。

 XmlReader/XmlWriterクラスも、読み込みと書き込みで、まったく異なる性質を発揮するので、分けて考える価値がある。XmlReaderクラスを使った読み込みは、DOMを使った読み込みよりも複雑で分かりにくくなる傾向があるが、逆にXmlWriterクラスを使った書き込みは、DOMを使った書き込みよりもシンプルで分かりやすくなる傾向が感じられる。その点で、初心者が取りあえずXML文書を出力するプログラムを記述する場合はXmlWriterクラスがお勧めであるが、読み込むプログラムの場合はDOMを使う方がお勧めである。

 ただし、巨大なXML文書の中の特定の情報を、資源を浪費せずに抜き出す処理を記述する場合のXmlReaderクラスの効率のよさは特筆に値する。コーディングの手間は増える可能性はあるが、性能重視ならXmlReaderという選択もあり得るだろう。


 INDEX
  .NETで簡単XML
  第15回 川俣流XMLプログラミングの定石(1)
    1.XMLプログラミングにおける定石の必要性
    2.XMLファイル書き込み時の問題点
    3.安全なXMLファイル書き込みのための定石
  4.XML文書の読み書きにどの方法を使うか
    5.シリアライズを使った読み書きの問題点
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間