連載

.NETで簡単XML

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

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

XmlRoot属性やXmlType属性とスキーマの関係

 シリアライズ時に、XML文書の形式に影響を与えるさまざまな属性が用意されていることはすでに説明したが、それらの属性は、スキーマにも影響を及ぼすことができる。実際に、XmlRoot属性やXmlType属性が、xsd.exeによってスキーマを生成する際に、その内容に影響を及ぼしていることを確認してみよう。

 まず、以下のようなクラスを用意してみた。すでに使用したサンプル・プログラム1-1のクラスにXmlRoot属性とXmlType属性を付けたものである。

<XmlRoot("person"), XmlType("PersonType")> _
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 Age
    End Get
    Set(ByVal Value As Integer)
      Age = Value
    End Set
  End Property
End Class
サンプル・プログラム3:XmlRoot属性とXmlType属性をつけたPersonクラス(VB.NET版C#版

 これをビルドした上で、以下のコマンドによりスキーマを生成してみる。

xsd (アセンブリのファイル名) /t:Person

 すると次のようなスキーマが生成された。

<?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="PersonType" />
  <xs:complexType name="PersonType">
    <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>
属性を追加したPersonクラスより生成されたスキーマ

 これをVisual Studio .NETで開くと、以下のように見える。

属性ありで生成されたスキーマの表示

 これを、属性なしで生成したスキーマをVisual Studio .NETで開いた画面(前掲したものと同じ画面)と比較してみよう。

属性なしで生成されたスキーマの表示

 属性なしの場合、左側のボックスに、Personというキーワードが並んで2つ見えていた。しかし、属性ありの例では、personとPersonTypeという名前に変わっている。

 まず、Personがpersonに変わったところに注目しよう。これは要素の名前ではあるが、XmlRoot属性によってルート要素の名前を変更したことが反映されたものである。属性の指定が、シリアライズされるXML文書だけでなく、xsd.exeによって生成されるスキーマにも適用されていることが分かると思う。それにより、安心して、xsd.exeによって生成されるスキーマで、シリアライズされたXML文書の妥当性を検証できるわけである。

 次に、PersonがPersonTypeに変わったところに注目しよう。これは、データ型の名前が変わったことに対応したものであり、XmlType属性の引数で指定した名前が反映されたものである。しかし、シリアライズされるXML文書内に、PersonTypeというキーワードが出現することはない。このキーワードはスキーマ定義で使用される型の名前を指定する手段としてのみ機能する。XmlType属性は、スキーマを一切使わない場合には不必要な機能だが、できるだけ分かりやすいスキーマを自動生成させたいと思うなら、有益な機能といえる。

 さて、このスキーマからもう一度xsd.exeを使用してソース・コードを生成すると、どうなるだろうか。

'------------------------------------------------------------------------------
' <autogenerated>
'     This code was generated by a tool.
'     Runtime Version: 1.1.4322.573
'
'     Changes to this file may cause incorrect behavior and will be lost if
'     the code is regenerated.
' </autogenerated>
'------------------------------------------------------------------------------


Option Strict Off
Option Explicit On

Imports System.Xml.Serialization

'
'このソース コードは xsd によって自動生成されました。Version=1.1.4322.573 です。
'


'<remarks/>
<System.Xml.Serialization.XmlRootAttribute("person", [Namespace]:="", IsNullable:=true)>  _
Public Class PersonType

  '<remarks/>
  Public Name As String

  '<remarks/>
  Public Age As Integer
End Class
サンプル・プログラム4:属性ありで生成されたスキーマから自動作成したソース・ファイル(VB.NET版C#版

 属性なしのソース・コードからスキーマを生成し、そこからソース・コードを生成した場合と上記の結果を比較してほしい。

 まずクラスの名前が変化していることが分かるだろう。前の例と異なり、スキーマ上で指定されたデータ型の名前であるPersonTypeがクラスの名前になっている。そして、XmlRoot属性によって、実際にXML文書に書き込まれる要素名personを指定する記述が追加されている。このように、xsd.exeを経由して変換する場合、スキーマの型と、生成されるソース・コードの内容は、影響を与え合うわけである。これを上手く使えば、ソース・コード上での読みやすさと、XML文書上での読みやすさを両立させることが可能になるだろう。

 さて、今回でシリアライズの話題は一段落なのだが、これで終わりではない。本連載の第9回で触れたように、.NET Frameworkには、XmlSerializerクラス(System.Xml.Serialization名前空間)を使用する方法のほかに、別のシリアライズの機能(Serializable属性を用いる方法)が存在しているのである。次回は、それについて、解説したいと思う。また、それに加えて、Webサービスで行われるシリアライズの仕組みについて分かりにくい部分を解説し、XmlSerializerを使ってエンコード済みSOAP形式でシリアライズする方法にも触れたいと思う。End of Article


 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 記事ランキング

本日 月間