VB.NET Tips - XMLファイルをINIファイルの様に扱う処理について
INIファイルは簡単にプログラムの動作パラメータなどを保存しておくには便利な機能です。
この機能をXMLファイルで出来る様にクラスを作成してみました。
INIファイルへの書込み、読み込みの様な関数を持ったクラスになります。
以下にそのクラスのソースを示します。
XMLファイルをINIファイルの様に読み書きクラス
001 | Imports System.Xml |
002 | Imports System.Text |
003 |
004 | Public 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 |
115 | End Class |
このクラスを利用する例を以下に記します。 フォーム(frmXmlIni)の上にボタンを貼り付け、このボタン処理内で、 最初にXMLファイルへの書込を行い、その後でそのXMLファイルからの読込を行っています。 その後さらに、書込と読込を行っています。
01 | Public 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 |
38 | 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>