これはまさにあなたが求めていることではありませんが、生のXMLを扱うことは多くの頭痛の種につながることがわかりました。代わりに検討するのは、ログイン/ログアウトでロジックを実行できるShiftクラスを処理し、.NETにシリアル化/逆シリアル化を実行させることです。
そうすれば、ビジネスオブジェクトと関係が変更された場合でも、特定のXMLパスに拘束されることはありません。
繰り返しますが、あなたが尋ねたことではありませんが、これがあなたが扱っているビジネスケースをどのように解決するかです。
まず、ビジネスロジックを配置できるシフトクラスを作成します。ここでの簡単な例:
Public Class Shift
Public Property Name As String
Public Property DateString As String
Public Property Login As String
Public Property Logout As String
End Class
次に、シフトのコレクションを作成します。このクラスをTimeCollectionと呼びましたが、好きなように呼んでください。.NETがオブジェクトからXMLに、またはその逆に変換する作業を実行できるように、シリアル化可能としてマークを付けます。
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.IO
Imports System.Xml.Serialization
<Serializable()> Public Class TimeCollection
Public Property Path As String
<XmlArray("Shifts")>
<XmlArrayItem(GetType(Shift))>
Public Property Shift As Shift()
Public Function Serialize(FileInfo As System.IO.FileInfo)
Try
If File.Exists(FileInfo.FullName) Then
File.Delete(FileInfo.FullName)
End If
If Not Directory.Exists(FileInfo.DirectoryName) Then
Directory.CreateDirectory(FileInfo.DirectoryName)
End If
Me.Path = FileInfo.FullName
Dim serializer As XmlSerializer = New XmlSerializer(GetType(TimeCollection))
Dim writer As StreamWriter = New StreamWriter(FileInfo.FullName)
serializer.Serialize(writer, Me)
writer.Close()
Catch ex As Exception
Throw
End Try
End Function
Public Shared Function Deserialize(FileInfo As FileInfo) As TimeCollection
Dim serializedType As TimeCollection = Nothing
Dim path As String = FileInfo.FullName
If (Not File.Exists(path)) Then
Deserialize = serializedType
Else
Try
Dim serializer As XmlSerializer = New XmlSerializer(GetType(TimeCollection))
Dim reader As StreamReader = New StreamReader(path)
serializedType = serializer.Deserialize(reader)
reader.Close()
Deserialize = serializedType
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End If
End Function
End Class
今。次のような一連のシフトを生成するコードがある場合:
Dim tc As TimeCollection = New TimeCollection()
Dim first As Shift = New Shift()
first.Name = "Philipp"
first.Login = "14:11"
first.Logout = "14:45"
first.DateString = "3/31/2013"
Dim second As Shift = New Shift()
second.Name = "Phillip"
second.Login = "14:09"
' second.Logout = "15:01" (note 2nd shift has no logout)
second.DateString = "4/1/2013"
tc.Shift = New Shift(1) {first, second}
次のように、TimeCollectionオブジェクトを簡単にシリアル化できます。
tc.Serialize(New FileInfo("C:\SomePath\TimeCollectionA.xml"))
これにより、次のコンテンツが作成されます。
<?xml version="1.0" encoding="utf-8"?>
<TimeCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Path>C:\Temp\Tc.xml</Path>
<Shifts>
<Shift>
<Name>Philipp</Name>
<DateString>3/31/2013</DateString>
<Login>14:11</Login>
<Logout>14:45</Logout>
</Shift>
<Shift>
<Name>Phillip</Name>
<DateString>4/1/2013</DateString>
<Login>14:09</Login>
</Shift>
</Shifts>
</TimeCollection>
次に、コンテンツを逆シリアル化し、ファイルをオブジェクトのコレクションに戻すには、次の操作を実行できます。
Dim tc As TimeCollection
tc = TimeCollection.Deserialize(New FileInfo("C:\SomePath\TimeCollectionA.xml"))
これで、tc.Shift配列などを反復処理できます。