連載

.NETで簡単XML

第8回 VS.NETでXML Schemaを活用する(動作編)

株式会社ピーデー 川俣 晶
2003/09/27
Page1 Page2 Page3 Page4

うまくデータセットを作成できない場合

 スキーマからデータセットを作成する機能は、使いこなせば便利である。XML文書を扱うプログラムを作成する手順を楽にしてくれる。しかし、この機能は万能ではない。基本的に、データベースを利用するための機能がXMLを取り込んだものなので、XML文書として正当なものがうまく扱えない場合がある。例えば、上の例で使用したスキーマに、1つだけ要素を付け足すだけでそれを実際に見ることができる。

 上記のサンプル・プログラムのプロジェクトで、AddressBook.xsdを開き、次の画面のように上の箱に「作成者」という要素を付け足してみよう。データ型は文字列であるstringとする。要するに、住所録の作成者の名前を記録する要素を付け足してみた、という状況を想定している。

住所録の作成者を記録する要素「作成者」を追加

 すると、いきなりソースがビルド不能になる。ビルドすると、「型 '住所録' が定義されていません。」「型 '住所録.個人Row' が定義されていません。」というエラーを見ることになる。住所録クラスは、NewDataSetクラスに、住所録.個人RowクラスはNewDataSet.個人Rowクラスに名前が変更されてしまったのである。それらのクラス名を書き換えるだけでは十分ではない。さらに、Add個人Rowメソッドも、引数が増加してしまって、互換性がなくなっているのである。

 この状態で、極めてシンプルにXML文書を読み込んで書き出すだけのサンプル・プログラムを作成してみよう。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim addressBook1 As NewDataSet = New NewDataSet
  addressBook1.ReadXml("c:\bad01.xml")
  addressBook1.WriteXml("c:\bad02.xml")
End Sub
XML文書を読み込み、そのままファイルに書き出すだけのサンプル・プログラム(VB.NET版C#版

 このプログラムが読み込むXML文書として以下のようなファイルを用意してみた。

<?xml version="1.0" standalone="yes"?>
<住所録 xmlns="http://www.atmarkIT.co.jp/ns/sample/addressBook">
  <個人 ID="A0001">
    <名前>二平二郎</名前>
    <住所>足立区1-2-3</住所>
  </個人>
  <作成者>九谷九郎</作成者>
</住所録>
読み込むXML文書(bad01.xml)

 サンプル・プログラムを実行すると、以下のようなファイルが得られた。

<?xml version="1.0" standalone="yes"?>
<NewDataSet xmlns="http://www.atmarkIT.co.jp/ns/sample/addressBook">
  <住所録>
    <作成者>九谷九郎</作成者>
    <個人 ID="A0001">
      <名前>二平二郎</名前>
      <住所>足立区1-2-3</住所>
    </個人>
  </住所録>
</NewDataSet>
書き出されたXML文書(bad02.xml)

 見てのとおり、これは意図したXML文書ではない。ルート要素に入っているNewDataSetという名前の要素はスキーマ定義のどこにも書かれていないものである。また、スキーマでは作成者要素が個人要素のあとにあるように書かれているのに、前に書き込まれている。これは、最初に指定したスキーマを使った検証をパスしないXML文書である。

 このように、スキーマからデータセットを作成する機能は便利ではあるが、どんな場合にも完全に機能するものではない。その点に注意してうまく活用しよう。

次回予告

 XML Schemaは、それを使わない場合と比較して、あるいは古いDTDを使う場合と比較して、非常に多くのメリットをもたらしてくれる。そのため、有益な結果が得られる場合は、使うことをためらうべきではない。しかし、XML Schemaが万全でも完璧でもないということを認識しておく必要があるだろう。XML Schemaを使っている途中で壁に突き当たり、RELAX NGのようなほかのスキーマ言語を使う必要に迫られる可能性もあり得る。それなら最初からRELAX NGを使えばよいのかといえば、VS.NETが提供する便利な機能はRELAX NGではなくXML Schemaに対応しているものなので、やはりXML Schemaを使いたい気持ちも残るのである。つまり、完璧な答がないのが現状である。それを踏まえた上で活用していこう。

 同じようなことは、ADO.NETにもいえる。確かに使うと便利な機能もあるが、すべてのケースで便利に機能するわけではない。従来型のデータベースとXMLの隔たりの大きさは、そう簡単に両者を統合して扱えないという現状を見れば明らかだ。しかし、使える場面をよく見極めて、有益な結果をもたらしてくれるケースにどんどん使っていこう。

 さて、次回はオブジェクトをXMLでシリアライズする方法を解説する予定である。シリアライズとはオブジェクトの内容をファイルなどに入出力する機能だが、.NET Frameworkでは、その時のフォーマットとしてXMLを利用することができる。それによって、出力されたクラスの内容を便利に活用することなどが可能となるのである。End of Article


 INDEX
  .NETで簡単XML
  第8回 VS.NETでXML Schemaを活用する(動作編)
    1.XML文書読み込み時にXML Schemaで内容をチェックする
    2.スキーマからデータセットを作成する(1)
    3.スキーマからデータセットを作成する(2)
  4.データセットを作成できない場合
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間