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>
''' <typeparam name="T">変換後の型</typeparam>
    ''' <param name="filePath">Xmlファイルパス</param>
    ''' <returns></returns>
    Public Shared Function GetObject(Of T)(ByVal filePath As String) As T

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

        '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 T = DirectCast(serializer.Deserialize(sr), T)

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

        Return obj

    End Function

End Class



4.使用方法

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

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

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

End Sub


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





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



関連記事

コメント

コメントの投稿

※名前とタイトルが入力されていないコメントでは他のコメントとの区別ができません。

 入力されていないコメントには返信しませんのであらかじめご了承くださいませ。

※ニックネームでも良いので必ずご入力ください。

    

※必ずご入力ください。

    
    

※必ずご入力ください。

※技術的な質問には環境やエラーについて正確かつ詳細にお教えください。

・正確なエラーの内容

・Windowsのバージョン番号

・Visual Studioのバージョン

・機器の型番

・アプリやソフトのバージョン

    

カテゴリ別記事一覧

広告

プロフィール

石河 純


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

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Catalina 10.15 / Mojave 10.14 / High Sierra 10.13 / Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
【データベース】
Oracle 10g/9i
SQLServer 2016/2008R2/2005/2000
SQLAnywhere 16/11/8
【BI/レポートツール】
Cognos ReportNet (IBM)
Microsoft PowerBI
ActiveReport (GrapeCity)
CrystalReport
【OCX関連】
GrapeCity InputMan SPREAD MultiRow GridView
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS jQuery IIS6/7 apache2

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