連載

.NETで簡単XML

第12回 オブジェクトをXMLでシリアライズ(4)

― xsd.exeを使ってスキーマを自動生成する ―

株式会社ピーデー 川俣 晶
2003/12/23
Page1 Page2 Page3

Back Issue
1
XML超入門
2
プログラムでXML文書を作成する
3
XML文書を読み書きするプログラムの作成
4
DOM(Document Object Model)

5

DOMとXPath

6

.NETプログラムでXSLTスクリプトを使う

7

VS.NETでXML Schemaを活用する(作成編)
8
VS.NETでXML Schemaを活用する(動作編)
9
オブジェクトをXMLでシリアライズ(1)
10
オブジェクトをXMLでシリアライズ(2)
11
オブジェクトをXMLでシリアライズ(3)

 この連載では、すでに第7回でXMLのスキーマ言語であるXML Schemaについて取り上げている。実は、シリアライズの機能もスキーマと密接に連動しているのである。スキーマと連動していることは、2つの点でシリアライズに大きな付加価値を与えてくれる。

 第1の付加価値は、シリアライズ結果のXML文書の正しさをスキーマによって検証できるようになることである。同じプログラム内で、シリアリズしてデシリアライズするだけならそれ程はありがたみが感じられないかもしれない。しかし、異なるアーキテクチャのシステムが混在する環境では、ほかのプログラムがシリアライズしたファイルを受け取ってデシリアライズする場合、それが本当に意図したとおりのXML文書になっているか、完全に信用ができないことがある。特にまったくアーキテクチャの異なるシステム、不特定多数のシステムと通信する場合は、そのような懸念が当然発生するだろう。そのような場合に、スキーマを用いて妥当性を検証することができれば、システムの安全性が高まる。

 第2の付加価値は、スキーマがあれば、そこからスキーマに対応したクラスを作成できることである。例えば、プログラムを開発する際に、「このスキーマに適合するXML文書を出力するように作ってくれ」と言われた場合、そのスキーマからクラスを定義するソース・コードを自動生成することができる。そのクラスをシリアライズすれば、(ほとんどの場合)スキーマに適合するXML文書になるというわけである。これによって、労力の軽減と、スキーマの適合性に対する安全性の双方を、容易に手に入れることができる。

xsd.exeによるスキーマの自動生成

 それでは、シリアライズ可能な自作クラスに対応するスキーマを自動生成させてみよう。

 まず、これまで使ってきたものと同じ、以下のようなクラスを対象としてみよう。このクラスを含むプロジェクトを作成してビルドしておく。このクラスを呼び出すコードなどは不要で、ただ単にこのクラスがプロジェクトに含まれているだけでよい。

Public Class Person
  Private m_name As String = "未設定"
  Private m_age As Integer = 0
  Public Property Name() As String
    Get
      Return m_name
    End Get
    Set(ByVal Value As String)
      m_name = Value
    End Set
  End Property

  Public Property Age() As Integer
    Get
      Return m_age
    End Get
    Set(ByVal Value As Integer)
      m_age = Value
    End Set
  End Property
End Class
サンプル・プログラム1:スキーマ自動生成の対象となるPersonクラス(VB.NET版C#版

 さて、次に、.NET Frameworkに含まれるXMLスキーマ定義ツール(起動時には「Microsoft(R) Xml Schemas/DataTypes support utility」と表示される。以下、このツールのファイル名を使って「xsd.exe」と記述する)を使用する。これはコマンドラインから使用するものだ。ここから先はコマンドラインの基本操作ができることを前提に話を進めるが、ここで必要とされる知識はそれほど複雑なものではないので、コマンドラインが分からない読者はこれを機会に勉強してもよいだろう。

 xsd.exeは多機能なプログラムで、スキーマからソース・コードを生成することも、ソース・コードからスキーマを生成することもできる。プログラム言語としてC#、Visual Basic .NET、JScript、Visual J#が対象で、さらにCodeDomProviderクラス(System.CodeDom.Compiler名前空間)を実装すればその他のプログラム言語も対象となる。スキーマ言語もXML Schemaに加えて、XML Schemaが勧告される前に主にマイクロソフトが使用していたXML-Data-Reducedというスキーマ言語がサポートされている。さらに、入力されたXML文書から推理してスキーマを生成するという機能まで持っている。

 さて、ここで行いたいことは、定義したクラスからのスキーマの生成である。スキーマを生成するには、xsd.exeの引数として、元になるクラスを含むアセンブリのファイル名と、「/t:クラス名」というオプションを指定する。これにより、ここで指定したクラスをシリアライズした際に作成されるXML文書に対応するスキーマが生成される。実際にこれを実行した画面を以下に示す。

xsd.exeを使用したスキーマ生成の実行例
xsd.exeのオプションに指定している「VBSample012.exe」には、サンプル・プログラム1のPersonクラスが含まれている。

 これを実行すると、schema0.xsdというファイルが生成される。その内容は以下のようなものになる。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="Person" nillable="true" type="Person" />
  <xs:complexType name="Person">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="Age" type="xs:int" />
    </xs:sequence>
  </xs:complexType>
</xs:schema>
xsd.exeによりPersonクラスから生成されたスキーマ

 このファイルをVisual Studio .NETで開くと、以下のような画面を見ることができる。

Visual Studio .NETによるスキーマの表示
生成されたスキーマをVisual Studio .NETで開いたところ。

 左側のボックスは、Person要素に関する定義である。このボックスには、Personというキーワードが2個横に並んでいて分かりにくいが、左側が要素の名前で、右側がデータの型の名前である。つまり、Person要素はPersonという型を持っているということを示している。ではPerson型とは何かというと、右側のボックスがそれを示している。[CT]というのは「Complex Type」のことで、複数の項目を含む複雑な型であることを示す。ここでは、内容として、string型のNameとint型のAgeを含んでいることが示されている。左側のボックスにも、NameとAgeが見えるが、Person型の内容が複写されて見えているだけで、これはグレーで表示され、操作できないようになっている。

 このように生成されたスキーマは、この連載でもすでに解説したように、XML文書の妥当性の検証に使用することができる。例えば、これからデシリアライズしようとしているデータを、デシリアライズする前にチェックするために使うことができる。それだけでなく、異なるシステムがシリアライズを行う場合には、送信側のプログラムを作成するプログラマーに、このスキーマを渡すことができる。「このスキーマを満たすXML文書を送信するようにプログラムを作成してくれ」と言えば、あいまいさのある日本語でくどくど説明するよりも、厳密さが格段に上がり、トラブルも減ることだろう。


 INDEX
  .NETで簡単XML
  第12回 オブジェクトをXMLでシリアライズ(4)
  1.xsd.exeによるスキーマの自動生成
    2.スキーマからソースの生成
    3.XmlRoot属性やXmlType属性とスキーマの関係
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間