連載

.NETで簡単XML

第2回 プログラムでXML文書を作成する

株式会社ピーデー 川俣 晶
2003/03/21

Page1 Page2 Page3

xmlWriter.WriteString(Chr(13) & Chr(10))
 次に、WriteStringメソッドが記述されている。これは出力するXML文書に改行を入れるために記述されている。読みやすくするためにタグの後で改行したりインデントを付けたりしているXML文書をよく見掛けるが、これらは自動的に行われるわけではないということである。改行や空白をXML文書に入れたければ、意識的にそれらの文字を出力しなければならない。しかし、改行やインデントに使われた空白文字(改行やタブも含む)は、有効な文字データとして認識されるので、よく考えないで挿入していくと後で困ったことになる場合もある。

xmlWriter.WriteStartElement("c")
xmlWriter.WriteString("sample3")
xmlWriter.WriteEndElement()

 続いて、WriteStartElementメソッド、WriteStringメソッド、WriteEndElementメソッドが順番に記述されている。これは、テキストの内容を持つ要素を1つ出力している。つまり、これによって、「<c>sample3</c>」という出力が得られるわけである。これと同じことを1回のメソッド呼び出しで行う方法もある。それが、その次のWriteElementStringメソッドである。

xmlWriter.WriteElementString("d", "sample4")
 この例では、「d」と「sample4」を渡して、「<d>sample4</d>」という出力を得ている。テキストの内容のみを持つ要素を出力する機会は多いので、それを1回の呼び出しで行うWriteElementStringメソッドは有益な存在である。

xmlWriter.WriteEndElement()
 次に、WriteEndElementメソッドで最初のWriteStartElementメソッドで開始した要素を閉じている。前に出てきたWriteEndElementメソッドと異なり、こちらの方は内容があるので、空要素タグにはならず、終了タグを出力している。

xmlWriter.WriteWhitespace(Chr(13) & Chr(10))
 次に記述されているのは、WriteWhitespaceメソッドだ。これは、空白文字(改行、タブを含む)を出力するメソッドである。ここでは復帰・改行(Chr(13) & Chr(10))を出力している。それならWriteStringメソッドで復帰・改行(Chr(13) & Chr(10))を出力しても同じように思える。では、WriteStringメソッドとは異なるWriteWhitespaceメソッドが存在する理由は何だろうか。興味のある人は、このサンプル・ソースのWriteWhitespaceメソッドをWriteStringメソッドに書き換えて実行してみるとよいだろう。XML文書の仕様として、文字データはどこにでも書けるわけではない。少なくとも、最上位の要素(ルート要素)の外側に文字データを書くことはできない。それ故に、最後のWriteEndElementメソッドの後で、WriteStringメソッドを実行しようとしても、エラーになる。しかし、ここにコメントや空白文字を記述することは文法上許されている。最後の終了タグの後に改行を入れてからコメントを付け加えるような場合もあるので、空白文字を出力する手段が用意されている。これがWriteWhitespaceメソッドなのである。

xmlWriter.WriteComment("end of document")
 続いて、WriteCommentメソッドが記述されている。これはコメントを出力するメソッドである。引数にコメントの内容となる文字列を指定する。前後に付く「<!--」や「-->」はメソッドが自動的に付加してくれるので、意識する必要はない。

xmlWriter.WriteEndDocument()
 次に、WriteEndDocumentメソッドが記述されているが、この例では特に何も出力しない。このメソッドには、閉じていない要素や属性があればそれを閉じる機能がある。

xmlWriter.Close()
 最後に、Closeメソッドが記述されている。これには、使用されているすべての資源を閉じる機能がある。閉じていない要素や属性があればそれを閉じる機能もある。プログラムの最後には必ずこのメソッドを呼び出すようにしよう。このサンプル・ソースでも、finallyブロック内に記述して必ず実行されるようにしている。

 以上のように、自分がどんな出力を得たいかが分かっていれば、それぞれに対応する出力メソッドを呼び出すだけでXML文書が得られる。さほど難しいことではない。

スタートとエンドが対応しない場合

 WriteEndDocumentメソッドやCloseメソッドの説明で、閉じていない要素や属性があればそれを閉じる機能について触れた。これは、どのように機能するものだろうか。それを見るために、以下のようなサンプル・ソースを用意してみた。

 サンプル・ソースの構成は、前のソースとほぼ同様である。Windowsアプリケーションのテンプレートを新規作成して、Importsステートメント(C#ではusingディレクティブ)に以下の行を追加する。

Imports System.IO
Imports System.Xml
VB.NETでXmlTextWriterクラスを使用するためのImportsステートメント
C#でXmlTextWriterクラスを使用するためのusingディレクティブ

 そして、フォームのLoadイベントに以下のようなコードを記述する。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim stringWriter As StringWriter = New StringWriter()
  Dim xmlWriter As XmlTextWriter = New XmlTextWriter(stringWriter)
  Try
    xmlWriter.WriteStartDocument()
    xmlWriter.WriteStartElement("a")

    xmlWriter.WriteStartAttribute("attr1", "")
    xmlWriter.WriteString("sample1")
  Finally
    xmlWriter.Close()
  End Try

  Trace.Write(stringWriter.GetStringBuilder().ToString())
End Sub
スタートとエンドが対応しない例(VB.NET版)
スタートとエンドが対応しない例(C#版)

 これを実行すると以下のような結果が得られる。

<?xml version="1.0" encoding="utf-16"?><a attr1="sample1" />
作成されたXML文書

 見てのとおり、今回のサンプルには、WriteStartDocumentメソッドに対応するWriteEndDocumentメソッドはない。また、WriteStartElementに対応するWriteEndElementメソッドもなく、WriteStartAttributeメソッドに対応するWriteEndAttributeメソッドも記述されていない。しかし、まだ閉じていない項目を閉じるための文字列をCloseメソッドが出力してくれているため、属性も要素もきちんと閉じられている。一応、筋の通った整形式のXML文書が得られている。

 このことから、開始したものは必ず閉じるといった厳密さを意識せず、ルーズにプログラムを書いても通るように思えるかもしれない。しかし、この機能は万能ではない。開いたものを自動的に閉じてくれるとしても、それは機械的に行われるものである。たとえ、整形式のXML文書が出力されたとしても、それが本当に欲した書式を持つXML文書であるかどうかは分からない。このような機能に頼らないプログラミングを行う方が、いろいろな意味で安全といえるだろう。End of Article


 INDEX
  .NETで簡単XML
  第2回 プログラムでXML文書を作成する
    1.XML文書をプログラムから読み書きする方法
    2.XmlTextWriterクラスを使用したサンプル(1)
  3.XmlTextWriterクラスを使用したサンプル(2)
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間