反序列化 VB.NET 中的现有 XML 文件
Deserialize Existing XML file in VB.NET
我正在将 VB.NET 应用程序更改为使用 XmlSerializer 而不是 XMLDocument to read/write 到 XML 设置文件,并希望保持向后兼容性。
这是 XML 文件内容的示例:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<postHistory>
<postFile>a.txt</postFile>
<postFile>b.txt</postFile>
<postFile>c.txt</postFile>
</postHistory>
</appSettings>
<SettingsPath>d.txt</SettingsPath>
</configuration>
这是我想出的 类 正确反序列化原始文件的方法。
Imports System.Xml.Serialization
Imports System.Collections.Generic
<XmlRoot("configuration")>
Public Class LocalSettings
<XmlElement("appSettings")>
Public appSettings As New postHistory()
Public SettingsPath As String = ""
End Class
Public Class postHistory
Public postHistory As New SubSettings()
End Class
Public Class SubSettings
<XmlElement("postFile")>
Public postHistory As New List(Of String)
End Class
这是用于反序列化文件的代码:
Public Shared Function GetLocalSettings(ByVal filePath As String) As LocalSettings
Dim lSettings As New LocalSettings()
Try
Dim xs As New XmlSerializer(GetType(LocalSettings))
Using fs As New FileStream(filePath, FileMode.Open)
lSettings = xs.Deserialize(fs)
End Using
Catch ex As Exception
' Handle exception
End Try
Return lSettings
End Function
这个解决方案有效但感觉很尴尬。是否有更好的反序列化方法,不需要将 'postHistory' 列表嵌套在两个子 类 中?
您可以使用XmlArrayAttribute(string name)
to specify that a list should be serialized in two levels, with the outer container element having the specified name. Then you can use XmlArrayItemAttribute(string name)
指定内部元素名称。
因此:
<XmlRoot("configuration")>
Public Class LocalSettings
<XmlElement("appSettings")>
Public appSettings As New postHistory()
Public SettingsPath As String = ""
End Class
Public Class postHistory
<XmlArray("postHistory")>
<XmlArrayItem("postFile")>
Public postHistory As New List(Of String)
End Class
这允许消除 SubSettings
class。
示例 fiddle.
有关详细信息,请参阅 Controlling XML Serialization Using Attributes。
我正在将 VB.NET 应用程序更改为使用 XmlSerializer 而不是 XMLDocument to read/write 到 XML 设置文件,并希望保持向后兼容性。
这是 XML 文件内容的示例:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<postHistory>
<postFile>a.txt</postFile>
<postFile>b.txt</postFile>
<postFile>c.txt</postFile>
</postHistory>
</appSettings>
<SettingsPath>d.txt</SettingsPath>
</configuration>
这是我想出的 类 正确反序列化原始文件的方法。
Imports System.Xml.Serialization
Imports System.Collections.Generic
<XmlRoot("configuration")>
Public Class LocalSettings
<XmlElement("appSettings")>
Public appSettings As New postHistory()
Public SettingsPath As String = ""
End Class
Public Class postHistory
Public postHistory As New SubSettings()
End Class
Public Class SubSettings
<XmlElement("postFile")>
Public postHistory As New List(Of String)
End Class
这是用于反序列化文件的代码:
Public Shared Function GetLocalSettings(ByVal filePath As String) As LocalSettings
Dim lSettings As New LocalSettings()
Try
Dim xs As New XmlSerializer(GetType(LocalSettings))
Using fs As New FileStream(filePath, FileMode.Open)
lSettings = xs.Deserialize(fs)
End Using
Catch ex As Exception
' Handle exception
End Try
Return lSettings
End Function
这个解决方案有效但感觉很尴尬。是否有更好的反序列化方法,不需要将 'postHistory' 列表嵌套在两个子 类 中?
您可以使用XmlArrayAttribute(string name)
to specify that a list should be serialized in two levels, with the outer container element having the specified name. Then you can use XmlArrayItemAttribute(string name)
指定内部元素名称。
因此:
<XmlRoot("configuration")>
Public Class LocalSettings
<XmlElement("appSettings")>
Public appSettings As New postHistory()
Public SettingsPath As String = ""
End Class
Public Class postHistory
<XmlArray("postHistory")>
<XmlArrayItem("postFile")>
Public postHistory As New List(Of String)
End Class
这允许消除 SubSettings
class。
示例 fiddle.
有关详细信息,请参阅 Controlling XML Serialization Using Attributes。