Quantcast
Channel: ソフラボの技術ブログ
Viewing all articles
Browse latest Browse all 166

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

$
0
0

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

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

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

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

環境

VisualStuido2010
.NET Framework4.0

シリアライズ

コード

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

Dim serializer AsNew XmlSerializer(GetType(User))Dim user As User = serializer.Deserialize(xdoc.CreateReader)'XElement使用時Dim xelementAs XElement= XElement.Parse(xml);

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

階層なし

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

  <XmlElement()>PublicProperty id AsString<XmlElement()>PublicPropertynameAsStringEnd 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")>PublicProperty users As List(Of User)End Class

<Serializable()>Public Class User

  <XmlElement()>PublicProperty id AsString<XmlElement()>PublicPropertynameAsStringEnd 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")>PublicProperty users As List(Of User)End Class

<Serializable()>Public Class User

  <XmlElement()>PublicProperty id AsString<XmlElement()>PublicPropertynameAsStringEnd 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の一部のみ定義することができますが、
下記の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と相性がよく自動でなんでもやってくれると思ったら何もしてくれませんでした。

逆引き大全

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

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


Viewing all articles
Browse latest Browse all 166

Trending Articles