簡體   English   中英

在VB.net中循環XML

[英]Looping XML in VB.net

我想做的是在XML文件(先生,夫人,博士...)中循環使用一堆前綴,然后將它們每個放入一個列表框,以便用戶可以單擊任意一個他們需要。

肯定有比這更簡單的方法:

<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 ... Loops和For i ... Loops。 類似於從<Prefixes>開始,然后查看第一個節點,獲取其文本,然后查看第二個節點,依此類推嗎?

您可以使用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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM