在VB.net中循环XML

时间:2014-12-24 22:02:19

标签: xml vb.net

我想做的是为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>开始然后查看第一个节点,获取文本,然后是第二个节点,依此类推?

1 个答案:

答案 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>