ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

VB.NETでXMLをデシリアライズするときのパターンまとめ

XMLでデシリアライズする方法を書いた記事があまりなかったので少しまとめてみました。

シリアライズができれば簡単にクラスとマッピングできて楽ちんです。

1階層の基本を覚えておけば、2階層移行ネストしていても使えます。
プロパティの型は、Stringですが適宜他の型に置換して下さい。

コードはVB.NETですが、C#に置き換えても使えます。

環境

VisualStuido 2010
.NET Framework 4.0

シリアライズ

コード

'XDocument使用時
Dim xml As String = ""
Dim xdoc As XDocument = XDocument.Parse(xml, LoadOptions.None);

Dim serializer As New XmlSerializer(GetType(User))
Dim user As User = serializer.Deserialize(xdoc.CreateReader)

'XElement使用時
Dim xelementAs XElement= XElement.Parse(xml);

Dim serializer As New XmlSerializer(GetType(User))
Dim user As User = serializer.Deserialize(xelement.CreateReader)

階層なし

<root>
  <id></id>
  <name></name>
</root>
<Serializable()>
Public Class User

  <XmlElement()>
  Public Property id As String

  <XmlElement()>
  Public Property name As String

End Class

1階層のリスト

<root>
  <user>
    <id></id>
    <name></name>
  </user>
</root>
-------------------------
<root>
  <user>
    <id></id>
    <name></name>
  </user>
  <user>
    <id></id>
    <name></name>
  </user>
</root>
<Serializable()>
Public Class Root

  <XmlElement("user")>
  Public Property users As List(Of User)

End Class

<Serializable()>
Public Class User

  <XmlElement()>
  Public Property id As String

  <XmlElement()>
  Public Property name As String

End Class

グルーピングのある1階層のリスト

<root>
  <users>
    <user>
      <id></id>
      <name></name>
    </user>
    <user>
      <id></id>
      <name></name>
    </user>
  </users>
</root>
<Serializable()>
Public Class Root

  <XmlArray("users")>
  <XmlArrayItem("user")>
  Public Property users As List(Of User)

End Class

<Serializable()>
Public Class User

  <XmlElement()>
  Public Property id As String

  <XmlElement()>
  Public Property name As String

End Class

XMLクラス

XDocument

正式なXMLでないと定義できません。
<?xml version="1.0" encoding="utf-8"?>は必須です。

VB.NETXMLリテラルを使うとこんな感じです。

Dim xdoc As XDocument = 
  <?xml version="1.0" encoding="utf-8"?>
  <root>
    <user>
      <id></id>
      <name></name>
    </user>
  </root>

XElement

<?xml version="1.0" encoding="utf-8"?>がなくても定義できます。

例えばXMLの一部のみ定義することができますが、<root>のようなまとめるタグが必須です。

VB.NETXMLリテラルを使うとこんな感じです。

Dim xdoc As XElement = 
  <root>
    <user>
      <id></id>
      <name></name>
    </user>
  </root>

XML属性

XmlElement

XMLのタグとマッピングします。

次の場合、<user>と対応します。

<user id="" name="" />

XmlAttribute

XMLの属性とマッピングします。

次の場合、id属性、name属性と対応します。

<user id="" name="" />

XmlArray

XMLでグルーピングを行うタグとマッピングします。

次の場合、<users>と対応します。

<users>
  <user></user>
  <user></user>
</users>

XmlArrayItem

XMLでグルーピング配下にあるタグとマッピングします。
XmlArrayと併用して使います。

次の場合、<user>と対応します。

<users>
  <user></user>
  <user></user>
</users>

まとめ

XmlSerializeクラスを使うとXMLからオブジェクト、オブジェクトからXMLに簡単に変換できます。
XMLと対応するクラスの作成が面倒くさいですが、一度作ってしまうと使い回しが効くので便利です。


XMLと対応するクラスを作るとき、保守しやすいようにプロパティ名は、XMLのタグ・属性と同じ名称にするのが良いです。
VB.NET予約語を使う場合、「[date]」というように角括弧を使います。


配列やリストなのでプロパティの属性に「XmlArray」を使うというわけではないことがわかりました。
他サイトでXmlSerializerクラスは、ネストしたものを扱えないとありましたが、普通に深い階層でも自動で値を設定してくれます。


今回、SOAPAPIとのやりとりとのために使用しました。
別でSoapFormatterというクラスがあり、SOAPと相性がよく自動でなんでもやってくれると思ったら何もしてくれませんでした。

逆引き大全

Windows8/7完全対応 Visual Basic 2013逆引き大全―Visual Studio Professional 2013/Express 2013対応

Windows8/7完全対応 Visual Basic 2013逆引き大全―Visual Studio Professional 2013/Express 2013対応

Visual C# 2013逆引き大全 555の極意

Visual C# 2013逆引き大全 555の極意