2014-12-24 69 views
0

我想要做的是對XML文件(Mr,Mrs,Dr ....) 中的名稱取一堆前綴,並將它們分別放入一個列表框,所以用戶可以點擊他們需要的任何一個。在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>開始,然後查看第一個節點,獲取文本,然後是第二個節點,依此類推?

+2

輸出你想使用XmlSerializer或XmlReader?你能證明你碰到了什麼嗎? – Icepickle

回答

0

您可以使用XmlSerializer(創建/讀取XML文件)

對於這一點,你需要定義XmlRoot,而且應該在XML中使用的節點(公共屬性)

然後,您可以定義它們是否應該是元素,文本,屬性,數組,...

然後可以將列表(前綴)附加到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>