簡體   English   中英

使用LINQ使用.ToArray()將XML查詢到數組中

[英]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.

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