故郷を離れて三十数年、関東で暮らす永遠の少年のどーってことない日記
xxSEARCHxx
プロフィール

ST☆FF

Author:ST☆FF
HTTといえばインテルの Hyper-Threading Technology!・・・ではなく、放課後ティータイムのことだと思います。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク

最近の記事


スポンサーサイト 

--/--/-- --:--/--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

CATEGORY:スポンサー広告 | CM(-) | TB(-) |

アプリケーション構成ファイルとの格闘2 

2013/04/20 17:18/Sat
以前「アプリケーション構成ファイルとの格闘」において、タグ(のセット)を可変個数設定する方法について書きました。
今回、XMLファイルを別ファイルにすることでシンプルかつ編集可能にもする方法を見つけたので書きたいと思います。
XMLをバリバリ使いこなしておられる諸兄にはイロハのイでしょうが、私の職場環境は良くも悪くもアプリケーション構成ファイルに
ズブズブの状態であるため、掘り下げる機会もあまりなく、ほとんど初心者レベルなのであります。

今回の素材には「ID」と「氏名」を記述するXMLファイルを用い、変化をつけるため「ID」は数値として扱ってみます。
百聞は一見に如かず、下のような感じです。

【Persons.xml】
<?xml version="1.0" encoding="utf-8" ?>
<Settings>
<Person>
<ID>1</ID>
<Name>サンプル一郎</Name>
</Person>
<Person>
<ID>2</ID>
<Name>サンプルニ郎</Name>
</Person>
<Person>
<ID>3</ID>
<Name>サンプル三郎</Name>
</Person>
</Settings>

以降がこのファイルにアクセスするためのクラスです。
上位から順に見ていきます。
まず、ルートにある「Settings」タグを展開するためのクラスを定義します。
直下の「Person」タグの展開用に「CPerson」クラスオブジェクトを要素に持たせます。
「Person」タグの繰り返しは配列として表現します。

【Settings.vb】
Imports System.Xml.Serialization

''' <summary>
''' ルート要素となる「Settings」の内容を定義するクラス
''' </summary>
''' <remarks>"Person"タグが可変個数定義対応</remarks>
<XmlRoot("Settings")> _
Public Class CSettings

' Personタグ
' 可変個数定義を配列として表現
<XmlElement("Person")> _
Public person As CPerson()

End Class

次に「Settings」タグ直下の「Person」タグを展開するための「CPerson」クラスを定義します。
数値型の「ID」と文字列型の「氏名」を要素に持たせます。

【Person.vb】
Imports System.Xml.Serialization

''' <summary>
''' ルート要素直下の子要素「Person」の内容を定義するクラス
''' </summary>
''' <remarks></remarks>
Public Class CPerson

' IDタグ
<XmlElement("ID")> _
Public ID As Integer

' Nameタグ
<XmlElement("Name")> _
Public Name As String

End Class

最後にテスト用のコードです。
ボタン一つを配置したフォームを用意し、Clickイベントに下記コードを配置します。

【Form1.vb】
Imports System.IO
Imports System.Xml.Serialization

Public Class Form1
Private order As String() = _
{"", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十"}
Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

' 読み込み対象とするファイルパスを指定
' 以下は、実行ファイルと同じパスにXMLファイルがある前提
Dim path As String = _
System.IO.Path.Combine(Application.StartupPath, "Persons.xml")
Dim serializer As New XmlSerializer(GetType(CSettings))
Dim wkSettings As New CSettings
Try
' XMLファイルのEncodingを取得
Dim xmlDoc As New XmlDocument
xmlDoc.Load(path)
' 最初の子要素<?xml>(宣言部)を取得
' 取得した<?xml>要素(XmlNode型)をXmlDeclarationに
' キャストしてからEncoding属性を取りだす
Dim xmlEnc As System.Text.Encoding = _
System.Text.Encoding.GetEncoding(CType(xmlDoc.FirstChild, XmlDeclaration).Encoding)
' XMLファイルを読み込む
Using stream As FileStream = New FileStream(path, FileMode.Open)
' デシリアライズ処理
' Settingsクラスのオブジェクトに展開
wkSettings = CType(serializer.Deserialize(stream), CSettings)
End Using

' 最終メンバの情報を表示
Dim msg As String = "ID = " + wkSettings.person(wkSettings.person.Length - 1).ID.ToString() + vbNewLine + _
"Name = " + wkSettings.person(wkSettings.person.Length - 1).Name.ToString()
MessageBox.Show(msg, "最終メンバ")

' 最終メンバのIDを変更
wkSettings.person(wkSettings.person.Length - 1).ID = wkSettings.person.Length + 100

' 10人目まではメンバを追加
If wkSettings.person.Length < order.Length - 1 Then
Dim p As New CPerson
p.ID = wkSettings.person.Length + 1
p.Name = "サンプル" + order(p.ID) + "郎"
ReDim Preserve wkSettings.person(wkSettings.person.Length)
wkSettings.person(wkSettings.person.Length - 1) = p
End If

' 変更した内容を元のXMLファイルに上書き保存する
Using xmlWtr As New System.Xml.XmlTextWriter(path, xmlEnc)
' 字下げ(改行付き)で書き出す
xmlWtr.Formatting = Xml.Formatting.Indented ' 字下げ有効
xmlWtr.IndentChar = " "c ' 字下げキャラクタ
xmlWtr.Indentation = 2 ' 字下げ幅

' シリアライズ処理(保存)
serializer.Serialize(xmlWtr, wkSettings)
End Using

Catch ex As Exception
MessageBox.Show(ex.Message, "例外発生")

End Try

End Sub
End Class

ボタンをクリックすると、末尾「Person」の内容を表示してから、そのIDに100を加算し、新たな「Person」を追加して保存します。





スポンサーサイト

CATEGORY:仕事関係 | CM(0) | TB(0) |
xx HOME xx
トラックバックURL
→http://3335.blog106.fc2.com/tb.php/225-f8a50dd9

コメントの投稿














xx HOME xx

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。