[英]Use LINQ to query XML into an array using .ToArray()
我是一位VB6資深人士,逐漸熟悉VB.NET。 我有一個正在嘗試使用XML文件(基本應用程序設置除外)進行配置的應用程序。
我想從文件中的單個XML節點讀取元素,並創建一個字符串數組。 我搜索了這個站點和其他站點,發現了許多執行非常相似的操作的示例,但是並不能完全理解它(特別是如果問題/答案在C#中)。
我不是XML專家,但是我知道如何選擇單個節點,我可以編寫一些合理整潔的代碼,這些代碼將遍歷子元素,並通過使用redim手動構建數組,這將很好地工作。 但是...我正在嘗試通過特定示例學習新技術。
所以...似乎使用2或3個相當緊湊的語句,我應該能夠編寫LINQ查詢並使用.ToArray()擴展方法填充數組,而無需求助於循環構造。
這是我的XML的表示形式:
<?xml version="1.0"?>
<targets>
<target name="abc">
<index>0</index>
<randoms>
<string>index</string>
<string>local</string>
<string>news</string>
<string>journal</string>
<string>information</string>
</randoms>
</target>
<target name="xyz">
<index>1</index>
<randoms>
<string>cat</string>
<string>dog</string>
<string>mouse</string>
</randoms>
</target>
</targets>
我要從中構建數組的元素是“字符串”元素。 在我的代碼中,我將使用目標索引來選擇適當的節點(除了“隨機”以外,還有其他節點,但它們與本示例無關。
此解決方案創建一個對象,將其保存到xml文件,將其設置為空,然后從xml文件加載回去。 制作一個新的控制台應用程序,並使用下面顯示的內容覆蓋所有代碼。
獎勵: ToArray()
用於證明該類的列表成員是IEnumerable
Imports System.Xml.Serialization
Imports System.IO
Module Module1
Private targets As XmlTargets
Sub Main()
targets = New XmlTargets
targets.Targets = New List(Of XmlTarget)
Dim t1 As New XmlTarget
t1.Name = "abc"
t1.Index = 0
t1.Randoms = New Random()
t1.Randoms.Strings = New List(Of [String])
Dim s1 As New [String]()
s1.Type = 1
s1.Text = "index"
Dim s2 As New [String]()
s2.Type = 2
s2.Text = "value"
t1.Randoms.Strings.Add(s1)
t1.Randoms.Strings.Add(s2)
Dim t2 As New XmlTarget
t2.Name = "xyz"
t2.Index = 1
t2.Randoms = New Random()
t2.Randoms.Strings = New List(Of [String])
targets.Targets.Add(t1)
targets.Targets.Add(t2)
SaveXmlFile()
targets = Nothing
LoadXmlFile()
Dim ts = targets.Targets.ToArray()
End Sub
Private Sub LoadXmlFile()
Dim s As New XmlSerializer(GetType(XmlTargets))
Using sr As New StreamReader("test.xml")
targets = s.Deserialize(sr)
End Using
End Sub
Private Sub SaveXmlFile()
Dim s As New XmlSerializer(GetType(XmlTargets))
Using sw As New StreamWriter("test.xml")
s.Serialize(sw, targets)
End Using
End Sub
End Module
<XmlRoot("targets")>
Public Class XmlTargets
<XmlElement("target")>
Public Property Targets As List(Of XmlTarget)
End Class
<Serializable>
Public Class XmlTarget
<XmlAttribute("name")>
Public Property Name As String
<XmlElement("index")>
Public Property Index As Integer
<XmlElement("randoms")>
Public Property Randoms As Random
End Class
<Serializable>
Public Class Random
<XmlElement("string")>
Public Property Strings As List(Of [String])
End Class
<Serializable>
Public Class [String]
<XmlAttribute("type")>
Public Property [Type] As Integer
<XmlText>
Public Property Text As String
End Class
這是軟件創建的XML文件。 注意:我沒有在上面的代碼之外編輯此文件-它是通過序列化類創建的。
<?xml version="1.0" encoding="utf-8"?>
<targets xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<target name="abc">
<index>0</index>
<randoms>
<string type="1">index</string>
<string type="2">value</string>
</randoms>
</target>
<target name="xyz">
<index>1</index>
<randoms />
</target>
</targets>
帖子已被編輯,以反映以下評論中要求的更改。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.