FC2ブログ

記事一覧

XMLデータから配列を含むクラスに変換する方法 | VB.NET


今回は VB.NET で XML に書かれている配列型のデータをオリジナルのクラスに変換してデータ保持する方法について覚え書きします。
Json を使用すると簡単に実現可能ですが、不要なDLLを参照することになりますし、何かあった時の為にできるだけ外部DLLには頼らないほうが良いと考えていますので、今回のコードは全て .Net のマネージコードなので、汎用性が高いものと考えています。


vb_xml_01.png


前提条件
Windows 7 professional 以降 / Windows Server 2008 R2 以降
Visual Studio 2010 professional 以降
VB.net
.Net FrameWork 4.0 以降



1.XMLファイルの構造

XMLファイルの中にはヘッダーと明細の部分を持たせて、今回は明細部分が List 型で取得できるように想定しました。

XmlSample.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <header>
    <id>1</id>
    <title>ヘッダー1</title>
  </header>
  <details>
    <detail>
      <id>1</id>
      <seq>1</seq>
      <name>明細1</name>
    </detail>
    <detail>
      <id>1</id>
      <seq>2</seq>
      <name>明細2</name>
    </detail>
    <detail>
      <id>1</id>
      <seq>3</seq>
      <name>明細3</name>
    </detail>
  </details>
</root>



2.ViewModelクラス

XMLのデータを保持するためのクラスを作成します。
ポイントとしては、変換するオブジェクトのクラス名にXmlRootの属性を設定し、値に最上位のタグの名称を設定します。
配列となるオブジェクトにはXmlArray(”配列のタグ名”) と XmlArrayItem("配列の元となるタグ名") を設定します。

XmlRoot.vb
<System.Xml.Serialization.XmlRoot("root")>
Public Class XmlSampleClass

    <System.Xml.Serialization.XmlElement("header")>
    Public Property Header As XmlHeader

    <System.Xml.Serialization.XmlArray("details"),
     System.Xml.Serialization.XmlArrayItem("detail")>
    Public Property Details As List(Of XmlDetail)

End Class

<System.Xml.Serialization.XmlType("header")>
Public Class XmlHeader

    <System.Xml.Serialization.XmlElement("id")>
    Public Property id As Integer

    <System.Xml.Serialization.XmlElement("title")>
    Public Property title As String

End Class

<System.Xml.Serialization.XmlType("detail")>
Public Class XmlDetail

    <System.Xml.Serialization.XmlElement("id")>
    Public Property id As Integer

    <System.Xml.Serialization.XmlElement("seq")>
    Public Property seq As Integer

    <System.Xml.Serialization.XmlElement("name")>
    Public Property [name] As String

End Class


この設定がXMLと相違がある場合は、以下のようなエラーが発生しますので、注意が必要です。

型 'System.InvalidOperationException' のハンドルされていない例外が System.Xml.dll で発生しました
{"XML ドキュメント (2,2) でエラーが発生しました。"}
{"<details xmlns=''> は指定できません。"}




3.XMLファイルを開く

StreamReaderでファイルを開き、シリアライザーで逆シリアライズしたオブジェクトを取得します。

XmlUtility.vb
Public Class XmlUtility

    ''' <summary>
    ''' Xmlを読み取り、クラスに変換して返す
    ''' </summary>
    ''' <param name="filePath">Xmlファイルパス</param>
    ''' <returns></returns>
    Public Shared Function GetSampleClassFromXml(ByVal filePath As String) As XmlSampleClass

        '読み込む型を指定します。
        Dim tp As Type = GetType(XmlSampleClass)

        'XmlSerializerオブジェクトを作成
        Dim serializer As New System.Xml.Serialization.XmlSerializer(tp)

        'UTF指定で開きます
        Dim encode As System.Text.Encoding = New System.Text.UTF8Encoding(False)

        '読み込むファイルを開く
        Dim sr As New System.IO.StreamReader(filePath, encode)

        'XMLファイルから読み込み、逆シリアル化する
        Dim obj As XmlSampleClass = DirectCast(serializer.Deserialize(sr), XmlSampleClass)

        'XMLファイルを閉じる
        sr.Close()

        Return obj

    End Function

End Class



4.使用方法

以下のように XmlUtility を呼び出し、変数に格納します。

TestForm.vb
Private Sub btnReadXml_Click(sender As Object, e As EventArgs) Handles btnReadXml.Click

Dim obj As XmlSampleClass = XmlUtility.GetSampleClassFromXml("c:\XmlSample.xml")

End Sub


以上でXMLファイルの中のデータをクラスに保持し、そのクラス内に配列も保持することができています。





最後までお読みいただき、ありがとうございます。
他にも VB.net に関する記事 をご紹介しておりますのでご参考頂ければ幸いです。



関連記事

コメント

コメントの投稿

カテゴリ別記事一覧

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。