忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

XMLファイルをINIファイルの様に扱う処理について

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Imports System.Xml
Imports System.Text
 
Public Class ClsXmlIni
    Private XmlDoc As XmlDocument
    Private XmlFileName As String
 
    ''' <summary>
    ''' コンストラクタ
    ''' </summary>
    ''' <param name="strXmlFilePath">XMLファイル</param>
    Public Sub New(ByVal strXmlFilePath As String)
        Try
            '初期XMLファイル読込
            Me.XmlFileName = strXmlFilePath
            Me.XmlDoc = New XmlDocument
 
            If System.IO.File.Exists(strXmlFilePath) = False Then
                'XML宣言を設定する
                Dim xmlDecl As System.Xml.XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", "Shift-JIS", Nothing)
                '作成したXML宣言をDOMドキュメントに追加します
                XmlDoc.AppendChild(xmlDecl)
            Else
                'ファイルが存在した場合
                XmlDoc.Load(strXmlFilePath) 'XMLファイルをロード
            End If
 
        Catch ex As Exception
            Throw ex
        End Try
    End Sub
 
    ''' <summary>
    ''' プロファイル文字列の取得
    ''' </summary>
    ''' <param name="strAppName">アプリケーション文字列</param>
    ''' <param name="strKeyName">キー文字列</param>
    ''' <param name="strDefault">デフォルト文字列</param>
    ''' <returns>プロファイル文字列</returns>
    Public Function GetProfileString(ByVal strAppName As String, _
                                     ByVal strKeyName As String, _
                                     ByVal strDefault As String) As String
        '戻り値初期化
        GetProfileString = strDefault
        Try
            '引数チェック
            If strAppName = "" Or strKeyName = "" Then Exit Function
 
            'INIノードチェック
            Dim xeleIni As XmlElement = Me.XmlDoc.SelectSingleNode("INI")
            If Not xeleIni Is Nothing Then
                'APPチェック
                Dim xeleApp As XmlElement = xeleIni.SelectSingleNode(strAppName)
                If Not xeleApp Is Nothing Then
                    'KEYチェック
                    Dim xeleKey As XmlElement = xeleApp.SelectSingleNode(strKeyName)
                    If Not xeleKey Is Nothing Then
                        GetProfileString = xeleKey.InnerText
                    End If
                End If
            End If
 
        Catch ex As Exception
            Throw ex
        End Try
    End Function
 
    ''' <summary>
    ''' プロファイル文字列設定
    ''' </summary>
    ''' <param name="strAppName">アプリケーション文字列</param>
    ''' <param name="strKeyName">キー文字列</param>
    ''' <param name="strSet">設定文字列</param>
    ''' <returns>True:正常, False:エラー</returns>
    Public Function WriteProfileString(ByVal strAppName As String, _
                                       ByVal strKeyName As String, _
                                       ByVal strSet As String) As Boolean
        '戻り値初期化
        WriteProfileString = False
        Try
            '引数チェック
            If strAppName = "" Or strKeyName = "" Then Exit Function
 
            'INIノードチェック
            Dim xeleIni As XmlElement = Me.XmlDoc.SelectSingleNode("INI")
            If xeleIni Is Nothing Then
                xeleIni = Me.XmlDoc.CreateElement("INI")        'INI要素を作成
                Call Me.XmlDoc.AppendChild(xeleIni)             'ドキュメントに追加
            End If
 
            'APPチェック
            Dim xeleApp As XmlElement = xeleIni.SelectSingleNode(strAppName)
            If xeleApp Is Nothing Then
                xeleApp = Me.XmlDoc.CreateElement(strAppName)   'APP要素を作成
                Call xeleIni.AppendChild(xeleApp)               'INI要素に追加
            End If
 
            'KEYチェック
            Dim xeleKey As XmlElement = xeleApp.SelectSingleNode(strKeyName)
            If xeleKey Is Nothing Then
                xeleKey = Me.XmlDoc.CreateElement(strKeyName)   'KEY要素を作成
                Dim xValKey As XmlText = Me.XmlDoc.CreateTextNode(strSet) '設定値を作成
                Call xeleKey.AppendChild(xValKey)               'KEY要素に値を追加
                Call xeleApp.AppendChild(xeleKey)               'APP要素に追加
            Else
                'KEYが存在
                xeleKey.InnerText = strSet
            End If
 
            'XMLファイルの上書き
            Me.XmlDoc.Save(Me.XmlFileName)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function
 
End Class

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

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

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

<?xml version="1.0" encoding="Shift-JIS"?>
<INI>
  <SECTION1>
    <DATA1>111</DATA1>
    <DATA2>222</DATA2>
  </SECTION1>
  <SECTION2>
    <DATA1>333</DATA1>
  </SECTION2>
</INI>

おすすめ本

share











PR

コメント

1. 参考になりました

xmlを簡単に読み書きしたいなと思い、とても参考になりました。ありがとうございます。
ClsXmlIniクラスをnewをしているところですが、ファイルが無い場合は初期化してますが、存在している場合の処理が無かったです。

If System.IO.File.Exists(strXmlFilePath) = False Then
'XML宣言を設定する
Dim xmlDecl As System.Xml.XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", xEncode.BodyName, Nothing)
'作成したXML宣言をDOMドキュメントに追加します
XmlDoc.AppendChild(xmlDecl)
Else
XmlDoc = New XmlDocument
XmlDoc.Load(strXmlFilePath) 'XMLファイルをロード
End If

こんな感じでうまく動きました。

2. 参考になりました

xmlを簡単に読み書きしたいなと思い、とても参考になりました。ありがとうございます。
ClsXmlIniクラスをnewをしているところですが、ファイルが無い場合は初期化してますが、存在している場合の処理が無かったです。

If System.IO.File.Exists(strXmlFilePath) = False Then
'XML宣言を設定する
Dim xmlDecl As System.Xml.XmlDeclaration = XmlDoc.CreateXmlDeclaration("1.0", xEncode.BodyName, Nothing)
'作成したXML宣言をDOMドキュメントに追加します
XmlDoc.AppendChild(xmlDecl)
Else
XmlDoc = New XmlDocument
XmlDoc.Load(strXmlFilePath) 'XMLファイルをロード
End If

こんな感じでうまく動きました。

3. ご指摘有難うございます。

みつなみ 様、ご指摘有難うございました。ファイルが存在した場合のバグがありましたので、記事の中身を修正致しました。
また何かありましたら、宜しくお願い致します。
コメントを書く