我是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>
我想要构建数组的元素是&#34;字符串&#34;元素。在我的代码中,我将使用目标索引来选择适当的节点(除了&#34; randoms和#34之外的节点;但它们与此示例无关。
答案 0 :(得分:0)
此解决方案创建一个对象,将其保存到xml文件,将其设置为空,然后将其从xml文件中加载回来。制作一个新的控制台应用程序,并用下面的内容覆盖所有代码。
Bonus: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>
已修改帖子以反映以下评论中要求的更改。