使用LINQ使用.ToArray()将XML查询到数组中

时间:2014-12-05 22:12:53

标签: arrays vb.net linq-to-xml

我是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之外的节点;但它们与此示例无关。

1 个答案:

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

已修改帖子以反映以下评论中要求的更改。