我想做的是为XML文件中的名称提供一堆前缀(Mr,Mrs,Dr ....) 循环遍历它们,并将它们分别放入列表框中,这样用户只需单击它们所需的任何内容即可。
必须有一个比这更简单的方法:
<ObitSettings>
<Prefixes>
Mr.
</Prefixes>
<Prefixes>
Mrs.
</Prefixes>
<Prefixes>
Rev.
</Prefixes>
<Prefixes>
Fr.
</Prefixes>
<Prefixes>
......
我有另一种方式,每个前缀都有自己的节点:
<Prefixes>
<Mister>Mr.</Mister>
<Missus>Mrs.</Missus>
...
</Prefixes>
但是这种方式在一个长字符串中给了我所有东西,只导致列表框中的项目。
我有点喜欢最后一种方式,因为它看起来更具描述性,所以如果有可能我希望能够像这样编写XML。如果没有,那么我将继续做任何工作。
我正在使用For Each ...循环和我...循环。
有点像从<Prefixes>
开始然后查看第一个节点,获取文本,然后是第二个节点,依此类推?
答案 0 :(得分:0)
您可以使用XmlSerializer(创建/读取xml文件)
为此,您需要定义XmlRoot
,以及应在Xml中使用的节点(公共属性)
然后,您可以定义它们是否应该是元素,文本,属性,数组......
List(Of Prefix)可以附加在ListBox的DataSource / ItemsSource上(取决于你是否需要wpf或winforms或asp.net)
<XmlRoot("OrbitSettings")>
Public Class OrbitSettings
<XmlElement("Prefixes")>
Public Property Prefixes As List(Of Prefix)
Public Sub New()
End Sub
End Class
Public Class Prefix
<XmlAttribute()>
Public Property Label As String
<XmlText>
Public Property Value As String
End Class
保存/创建XML文件
Function GetOrbitSettings(myStream As Stream) As OrbitSettings
Dim serializer As New XmlSerializer(GetType(OrbitSettings))
Dim orbitSetting As OrbitSettings = Nothing
Try
orbitSetting = DirectCast(serializer.Deserialize(myStream), OrbitSettings)
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex.Message + "\r\n" + ex.StackTrace)
orbitSetting = New OrbitSettings() With {.Prefixes = New List(Of Prefix)}
End Try
Return orbitSetting
End Function
Function GetOrbitSettings(filename As String) As OrbitSettings
If File.Exists(filename) Then
Dim settings As OrbitSettings = Nothing
Using fileStream As New FileStream(filename, FileMode.Open, FileAccess.Read)
settings = GetOrbitSettings(New FileStream(filename, FileMode.Open, FileAccess.Read))
End Using
If settings IsNot Nothing Then
Return settings
End If
End If
Return New OrbitSettings() With {.Prefixes = New List(Of Prefix)}
End Function
Function SaveOrbitSettings(myStream As Stream, settings As OrbitSettings) As Boolean
Dim succeeded As Boolean = False
Try
Dim serializer As New XmlSerializer(GetType(OrbitSettings))
serializer.Serialize(myStream, settings)
succeeded = True
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex.Message + "\r\n" + ex.StackTrace)
End Try
Return succeeded
End Function
Function SaveOrbitSettings(filename As String, settings As OrbitSettings) As Boolean
Dim succeeded As Boolean = True
Try
Using Str As Stream = New FileStream(filename, FileMode.Create, FileAccess.Write)
succeeded = SaveOrbitSettings(Str, settings)
End Using
Catch ex As Exception
System.Diagnostics.Debug.WriteLine(ex.Message + "\r\n" + ex.StackTrace)
succeeded = False
End Try
Return succeeded
End Function
以小主程序为例
Sub Main()
Dim settings As New OrbitSettings With {.Prefixes = New List(Of Prefix)()}
Dim filename As String = Environment.CurrentDirectory + "\prefixes.xml"
settings.Prefixes.Add(New Prefix With {.Label = "Mr", .Value = "Mister"})
settings.Prefixes.Add(New Prefix With {.Label = "Ms", .Value = "Miss"})
settings.Prefixes.Add(New Prefix With {.Label = "Mss", .Value = "Misses"})
SaveOrbitSettings(filename, settings)
settings = GetOrbitSettings(filename)
For Each prf As Prefix In settings.Prefixes
Console.WriteLine("Found {0}: {1}", prf.Label, prf.Value)
Next
Console.ReadLine()
End Sub
然后会输出
<?xml version="1.0"?>
<OrbitSettings xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Prefixes Label="Mr">Mister</Prefixes>
<Prefixes Label="Ms">Miss</Prefixes>
<Prefixes Label="Mss">Misses</Prefixes>
</OrbitSettings>