連載

.NETで簡単XML

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

株式会社ピーデー 川俣 晶
2003/10/29
Page1 Page2 Page3

名前空間の指定

 要素名や属性名が指定できるなら、次に欲しくなるのは、それらの要素や属性の名前空間URIの指定である。もちろん、それは実現できる。以下に名前空間URIを指定したシリアライズの例を示す。

 ここではクラスの定義のみを示している。シリアライズなどの処理は、「属性の指定」などのサンプル・プログラムと同一であるので繰り返さない。

<XmlRoot("個人情報", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/person")> _
Public Class Person
  Private m_name As String = "未設定"
  Private m_age As Integer = 0

  <XmlElement("名前", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/name")> _
  Public Property Name() As String
    Get
      Return m_name
    End Get
    Set(ByVal Value As String)
      m_name = Value
    End Set
  End Property

  <XmlElement("年齢", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/age")> _
  Public Property Age() As Integer
    Get
      Return m_age
    End Get
    Set(ByVal Value As Integer)
      m_age = Value
    End Set
  End Property

  Public Sub Dump()
    Trace.WriteLine(m_name)
    Trace.WriteLine(m_age)
  End Sub
End Class
サンプル・プログラム4:名前空間URIを指定したシリアライズの例(VB.NET版C#版

 これを実行すると出力は以下のようになる。

山田太郎
17

 生成されたXML文書は以下のようになる。

<?xml version="1.0"?>
<個人情報 xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.atmarkIT.co.jp/xmlns/sample/person">
  <名前 xmlns="http://www.atmarkIT.co.jp/xmlns/sample/name">山田太郎</名前>
  <年齢 xmlns="http://www.atmarkIT.co.jp/xmlns/sample/age">17</年齢>
</個人情報>
生成されたXML文書

 ここで注目すべき点は、属性の名前付き引数として登場した「Namespace」である。これは、その属性が示す要素や属性に対して、名前空間URIを指定するために使われる。例えば、

XmlElement("名前", Namespace:="http://www.atmarkIT.co.jp/xmlns/sample/name")

という指定は、この属性が作るプロパティやフィールドを要素としてシリアライズし、要素名は「名前」、名前空間URIは「http://www.atmarkIT.co.jp/xmlns/sample/name」であることを指定している。名前付き引数Namespaceは、同様にXmlRoot属性にも付加することができる。

配列のシリアル化

 クラスに配列が含まれていたら、シリアライズはどうなるのだろうか。以下は実際に配列を含むクラスをシリアライズさせてみた例である。

 まずクラスの定義を見ていただこう。Personクラスと、そのクラスの配列を含むPersonsクラスを作成した。

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

Public Class Persons
  Public persons(2) As Person

  Public Sub SetPersons(ByVal person1 As Person, ByVal person2 As Person, ByVal person3 As Person)
    persons(0) = person1
    persons(1) = person2
    persons(2) = person3
  End Sub

  Public Sub Dump()
    For Each person As Person In persons
      Trace.WriteLine(person.Name)
      Trace.WriteLine(person.Age)
    Next
  End Sub
End Class
サンプル・プログラム5-1:配列を含んだクラス(VB.NET版C#版

 これらのクラスをシリアライズ、デシリアライズするサンプル・プログラムを以下に示す。Form1_Loadメソッドは、ほかの例と同じなので省略する。

Private Sub serializeSample()
  Dim person1 As New Person
  person1.Name = "山田太郎"
  person1.Age = 17

  Dim person2 As New Person
  person2.Name = "山田二郎"
  person2.Age = 16

  Dim person3 As New Person
  person3.Name = "山田三郎"
  person3.Age = 15

  Dim persons As New Persons
  persons.SetPersons(person1, person2, person3)

  Dim serializer As XmlSerializer = New XmlSerializer(GetType(Persons))
  Dim stream As FileStream = New FileStream("c:\sample.xml", FileMode.Create)
  Try
    serializer.Serialize(stream, persons)
  Finally
    stream.Close()
  End Try
End Sub

Private Sub deserializeSample()
  Dim serializer As XmlSerializer = New XmlSerializer(GetType(Persons))
  Dim persons As Persons
  Dim stream As FileStream = New FileStream("c:\sample.xml", FileMode.Open)
  Try
    persons = CType(serializer.Deserialize(stream), Persons)
  Finally
    stream.Close()
  End Try
  persons.Dump()
End Sub
サンプル・プログラム5-2:配列を含むクラスをシリアライズ/デシリアライズするメソッド(VB.NET版C#版

 これを実行すると出力は以下のようになる。

山田太郎
17
山田二郎
16
山田三郎
15

 生成されたXML文書は以下のようになる。

<?xml version="1.0"?>
<Persons xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <persons>
    <Person>
      <Name>山田太郎</Name>
      <Age>17</Age>
    </Person>
    <Person>
      <Name>山田二郎</Name>
      <Age>16</Age>
    </Person>
    <Person>
      <Name>山田三郎</Name>
      <Age>15</Age>
    </Person>
  </persons>
</Persons>
生成されたXML文書

 この例では、ソース・コード上に目新しい記述はない。実際に実行した例を見ると、配列の中に入っているクラスもシリアライズされ、Personクラスの配列は、単純なPerson要素の繰り返しに置き換えられていることが分かるだろう。しかし、これだけでは、思い通りのXML文書を出力するには不十分である。例えば、この例では、Persons要素の子要素にpersons要素があり、その子要素にPerson要素があるため、少し不必要に要素の階層が深すぎる印象も受ける。

 これらの問題に対処する方法は、次回に続く。乞うご期待である。End of Article


 INDEX
  .NETで簡単XML
  第10回 オブジェクトをXMLでシリアライズ(2)
    1.要素名を指定してシリアライズする
    2.属性の指定/参照されるオブジェクトのシリアル化
  3.名前空間の指定/配列のシリアル化
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間