|
連載 .NETで簡単XML 第3回 XML文書を読み書きするプログラムの作成 |
![]() |
では具体的な説明に入ろう。IsStartElementメソッドは、現在のノードが指定した名前の要素の開始位置かどうかを判定する機能を持っている。その位置であれば、trueを返す。ノードの種類がElementであるかどうかを調べて、それからノードのNameプロパティなどを調べる手順を1回で行うものであるといえる。次に、ReadElementStringメソッドは、WriteElementStringメソッドの読み込み版とでもいうべきものである。指定された名前の要素とその内容のテキストを読み取る。基本的には、「開始タグ+テキスト+終了タグ」という一連のシーケンスを読み取って、タグの名前が指定された名前に一致しているかを確認し、テキストを返すわけである。これを使えば、単純な「開始タグ+テキスト+終了タグ」という形式の情報を1回のメソッド呼び出しで読み取ることができる。順番は前後するが、次にGetAttributeメソッドにも注目しておこう。このメソッドは、ノードが要素の開始位置にあるときに、指定した名前の属性の値を取り出す機能を持っている。通常は名前を指定して属性の値を読み取ることが多いので、MoveToFirstAttributeメソッドとMoveToNextAttributeメソッドを繰り返すよりも使い勝手がよいだろう。
最後にEOFプロパティにも触れておこう。前の例では(XmlReaderクラスの)Readメソッドの戻り値で終了を判定していたが、EOFプロパティを調べることでも終了を判定できる。EOFプロパティはすべてのデータを読み込んだあとにtrueの値を取るようになる。このサンプル・プログラム内にはノードの位置を進めるメソッドが複数あるので、個別に判定させずに、EOFプロパティを用いて判定処理を1個所に集めているというわけである。なお、このサンプル・プログラムでは名前空間を使用している。名前空間URIを「http://www.atmarkit.co.jp/ns/sample/person/」として、これを文字列定数「ns」で参照して指定している。
さて、ここで重要な説明に入る。ReadElementStringメソッドは「開始タグ+テキスト+終了タグ」という形式の情報を読み取るが、読み取りが終わったときに、readerは終了タグの次のノードを指し示しているのである。もし、ループの最初に必ず(XmlReaderクラスの)Readメソッドを呼び出す仕様だと、ReadElementStringメソッドを実行後にReadメソッドをすぐ実行することになり、ノードは終了タグの次の次を示すようになってしまう。そうすると、終了タグの次のノードを処理するチャンスが永遠になくなってしまう。そこで、このサンプル・プログラムでは、ReadElementStringメソッドを実行した場合は、(XmlReaderクラスの)Readメソッドを実行することなく、ループの最初に戻るように配慮している。それを実現するために、(XmlReaderクラスの)Readメソッドがちょっと変に見える位置に記述されているわけである。なお、最初のノードは、(XmlReaderクラスの)Readメソッドを呼び出さないと読み込まれないので、ループの開始前に1回だけ呼び出している。
読み取り後にreaderが終了タグの次のノードを指し示すというReadElementStringメソッドの挙動は、「開始タグ+テキスト+終了タグ」というシーケンスが繰り返し出てくる場合に便利である。こういうシーケンスが2回繰り返されている場合、ReadElementStringメソッドを2回連続して実行すると、それだけで情報が読み取れるのである。そのようなテクニックを使ってPersonクラスのReadメソッドを書き換えたのが以下の例である。
|
|
| 簡略化したReadメソッド(VB.NET版) | |
| 簡略化したReadメソッド(C#版) |
これを見ると、非常にコンパクトになったと驚くかもしれないが、元のReadメソッドと完全に等価の機能を持ったメソッドというわけではない。前の例は、どんなXML文書を読み込んだ場合でも必要な情報だけを処理して、不明の情報は処理しないという構造になっている。それに対して、この例は、すべての要素と属性は意図した通りの順番に記述されていて、関係ない要素などは含まれないことが前提となっている。
さて、ここで使われているメソッドについても簡単に説明しておこう。MoveToContentメソッドは、現在のノードが内容となるノードであるかどうか確認し、そうでないならそのようなノードが出現するまで読み込む機能を持つ。ここではXML宣言や空白、コメントなどを読み捨てて、最初の要素の開始のノードまで進めるために記述している。次のMoveToAttributeメソッドは、指定した名前の属性までノードを進める機能を持つ。そして、ReadStartElementメソッドは指定した要素の開始を読み込む機能を持つ。これにより、ノードはperson要素の開始位置の次を示すようになる。
次回予告
2回にわたってXmlReader/XmlWriterについて解説してきたが、これらを使うと単なるテキスト・データとして読み書きするよりもはるかに簡単にXML文書を扱えるようになる。しかし、これは.NET Frameworkのクラス・ライブラリでXML文書を読み書きする方法の1つに過ぎない。ほかにもやり方は存在する。次回は、最もメジャーなXML文書へのアクセス手段である。DOM(Document Object Model)について解説する予定である。![]()
| INDEX | ||
| .NETで簡単XML | ||
| 第3回 XML文書を読み書きするプログラムの作成 | ||
| 1.XML文書を読み込む | ||
| 2.XML文書を読み込むサンプル・プログラム | ||
| 3.文書の妥当性を検証するXmlValidatingReaderクラス | ||
| 4.XML文書を読み書きするサンプル | ||
| 5.XML文書を読み書きするサンプルの解説 | ||
| 「連載 :.NETで簡単XML」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


