VB.NET Tips - XMLファイルをINIファイルの様に扱う処理について

INIファイルは簡単にプログラムの動作パラメータなどを保存しておくには便利な機能です。 この機能をXMLファイルで出来る様にクラスを作成してみました。

INIファイルへの書込み、読み込みの様な関数を持ったクラスになります。 以下にそのクラスのソースを示します。

XMLファイルをINIファイルの様に読み書きクラス

001Imports System.Xml
002Imports System.Text
003 
004Public Class ClsXmlIni
005    Private XmlDoc As XmlDocument
006    Private XmlFileName As String
007 
008    ''' <summary>
009    ''' コンストラクタ
010    ''' </summary>
011    ''' <param name="strXmlFilePath">XMLファイル</param>
012    Public Sub New(ByVal strXmlFilePath As String)
013        Try
014            '初期XMLファイル読込
015            Me.XmlFileName = strXmlFilePath
016            Me.XmlDoc = New XmlDocument
017 
018            If System.IO.File.Exists(strXmlFilePath) = False Then
019                'XML宣言を設定する
020                Dim xmlDecl As System.Xml.XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "Shift-JIS", Nothing)
021                '作成したXML宣言をDOMドキュメントに追加します
022                XmlDoc.AppendChild(xmlDecl)
023            End If
024 
025        Catch ex As Exception
026            Throw ex
027        End Try
028    End Sub
029 
030    ''' <summary>
031    ''' プロファイル文字列の取得
032    ''' </summary>
033    ''' <param name="strAppName">アプリケーション文字列</param>
034    ''' <param name="strKeyName">キー文字列</param>
035    ''' <param name="strDefault">デフォルト文字列</param>
036    ''' <returns>プロファイル文字列</returns>
037    Public Function GetProfileString(ByVal strAppName As String, _
038                                     ByVal strKeyName As String, _
039                                     ByVal strDefault As String) As String
040        '戻り値初期化
041        GetProfileString = strDefault
042        Try
043            '引数チェック
044            If strAppName = "" Or strKeyName = "" Then Exit Function
045 
046            'INIノードチェック
047            Dim xeleIni As XmlElement = Me.XmlDoc.SelectSingleNode("INI")
048            If Not xeleIni Is Nothing Then
049                'APPチェック
050                Dim xeleApp As XmlElement = xeleIni.SelectSingleNode(strAppName)
051                If Not xeleApp Is Nothing Then
052                    'KEYチェック
053                    Dim xeleKey As XmlElement = xeleApp.SelectSingleNode(strKeyName)
054                    If Not xeleKey Is Nothing Then
055                        GetProfileString = xeleKey.InnerText
056                    End If
057                End If
058            End If
059 
060        Catch ex As Exception
061            Throw ex
062        End Try
063    End Function
064 
065    ''' <summary>
066    ''' プロファイル文字列設定
067    ''' </summary>
068    ''' <param name="strAppName">アプリケーション文字列</param>
069    ''' <param name="strKeyName">キー文字列</param>
070    ''' <param name="strSet">設定文字列</param>
071    ''' <returns>True:正常, False:エラー</returns>
072    Public Function WriteProfileString(ByVal strAppName As String, _
073                                       ByVal strKeyName As String, _
074                                       ByVal strSet As String) As Boolean
075        '戻り値初期化
076        WriteProfileString = False
077        Try
078            '引数チェック
079            If strAppName = "" Or strKeyName = "" Then Exit Function
080 
081            'INIノードチェック
082            Dim xeleIni As XmlElement = Me.XmlDoc.SelectSingleNode("INI")
083            If xeleIni Is Nothing Then
084                xeleIni = Me.XmlDoc.CreateElement("INI")        'INI要素を作成
085                Call Me.XmlDoc.AppendChild(xeleIni)             'ドキュメントに追加
086            End If
087 
088            'APPチェック
089            Dim xeleApp As XmlElement = xeleIni.SelectSingleNode(strAppName)
090            If xeleApp Is Nothing Then
091                xeleApp = Me.XmlDoc.CreateElement(strAppName)   'APP要素を作成
092                Call xeleIni.AppendChild(xeleApp)               'INI要素に追加
093            End If
094 
095            'KEYチェック
096            Dim xeleKey As XmlElement = xeleApp.SelectSingleNode(strKeyName)
097            If xeleKey Is Nothing Then
098                xeleKey = Me.XmlDoc.CreateElement(strKeyName)   'KEY要素を作成
099                Dim xValKey As XmlText = Me.XmlDoc.CreateTextNode(strSet) '設定値を作成
100                Call xeleKey.AppendChild(xValKey)               'KEY要素に値を追加
101                Call xeleApp.AppendChild(xeleKey)               'APP要素に追加
102            Else
103                'KEYが存在
104                xeleKey.InnerText = strSet
105            End If
106 
107            'XMLファイルの上書き
108            Me.XmlDoc.Save(Me.XmlFileName)
109            Return True
110        Catch ex As Exception
111            Return False
112        End Try
113    End Function
114 
115End Class

このクラスを利用する例を以下に記します。 フォーム(frmXmlIni)の上にボタンを貼り付け、このボタン処理内で、 最初にXMLファイルへの書込を行い、その後でそのXMLファイルからの読込を行っています。 その後さらに、書込と読込を行っています。

01Public Class frmXmlIni
02 
03    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
04        Try
05            'XMLファイルのテスト
06            Dim strPath As String = System.IO.Path.GetDirectoryName(Application.ExecutablePath)
07            Dim Ini As New ClsXmlIni(strPath & "\TEST.XML")
08 
09            '書込テスト
10            Ini.WriteProfileString("SECTION1", "DATA1", "aaa")
11            Ini.WriteProfileString("SECTION1", "DATA2", "bbb")
12            Ini.WriteProfileString("SECTION2", "DATA1", "AAA")
13 
14            '読込テスト
15            Dim strDsp As String = ""
16            strDsp &= "SECTION1:DATA1=" & Ini.GetProfileString("SECTION1", "DATA1", "***") & vbCrLf
17            strDsp &= "SECTION1:DATA1=" & Ini.GetProfileString("SECTION1", "DATA2", "") & vbCrLf
18            strDsp &= "SECTION1:DATA1=" & Ini.GetProfileString("SECTION2", "DATA1", "@@@") & vbCrLf
19            MsgBox(strDsp)
20 
21            '書込テスト
22            Ini.WriteProfileString("SECTION1", "DATA1", "111")
23            Ini.WriteProfileString("SECTION1", "DATA2", "222")
24            Ini.WriteProfileString("SECTION2", "DATA1", "333")
25 
26            '読込テスト
27            strDsp = ""
28            strDsp &= "SECTION1:DATA1=" & Ini.GetProfileString("SECTION1", "DATA1", "") & vbCrLf
29            strDsp &= "SECTION1:DATA1=" & Ini.GetProfileString("SECTION1", "DATA2", "") & vbCrLf
30            strDsp &= "SECTION1:DATA1=" & Ini.GetProfileString("SECTION2", "DATA1", "") & vbCrLf
31            MsgBox(strDsp)
32 
33        Catch ex As Exception
34            MsgBox(ex.Message)
35        End Try
36    End Sub
37 
38End Class

この処理の後のXMLファイルの内容は以下の様になります。

<?xml version="1.0" encoding="Shift-JIS"?>
<INI>
  <SECTION1>
    <DATA1>111</DATA1>
    <DATA2>222</DATA2>
  </SECTION1>
  <SECTION2>
    <DATA1>333</DATA1>
  </SECTION2>
</INI>
総アクセス数