xml - 具有属性的 XML 元素的 LINQ To XML 语法

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

我是一个 LINQ 新手,我在以下方面遇到了一些问题。我正在尝试使用 LINQ 对 XML 文件执行查询,并将结果存储在与 XML 匹配的 DataClass 对象列表中。

我有一个定义如下的 XML 文件:

<NewDataSet>
    <NewDataTable>
      <Field>Accepted ASNs</Field>
      <Val>59</Val>
      <Order Number="1234" ShipDate="2009/05/21" />
      <Order Number="2190" ShipDate="2009/05/22" />
      <Order Number="1809" ShipDate="2009/05/22" />      
    </NewDataTable>
    <NewDataTable>
      <Field>Rejected ASNs</Field>
      <Val>8</Val>
      <Order Number="2901" ShipDate="2009/05/21" />
      <Order Number="2810" ShipDate="2009/05/24" />
      <Order Number="1419" ShipDate="2009/05/25" />
    </NewDataTable>
    <NewDataTable>
      <Field>Missing ASNs</Field>
      <Val>7</Val>
      <Order Number="2902" ShipDate="2009/05/19" />
      <Order Number="2898" ShipDate="2009/05/20" />
      <Order Number="1296" ShipDate="2009/05/22" />
    </NewDataTable>
 </NewDataSet>

我创建了一个数据类来支持这种 XML 格式。我想做的是创建一个 LINQ 查询来获取这 3 条记录并将它们存储到我的 DataClass 的列表中。

为了支持多个 Order 元素,我用“Order”结构的通用列表定义了我的类...它看起来像这样:

    Public Class ASNData
        Private _field As String
        Private _value As String
        Private _orders As List(Of Order)

        Public Property Field() As String
            Get
            Set
        End Property

        Public Property Value() As String
            Get
            Set
        End Property

        Public Property Orders() As List(Of Order)
            Get
            Set
        End Property

        Structure Order
            Private _number As String
            Private _date As Date

            Public Property Number() As String
                Get
                Set
            End Property

            Public Property ShippingDate() As Date
                Get
                Set
            End Property
        End Structure
    End Class

我遇到的最大问题是弄清楚如何获取 3 个订单元素并将它们存储到我的订单结构列表中。

有人能指出我在这方面的正确方向吗?

谢谢。

最佳答案

下面是带有您需要的 LINQ 查询的控制台应用程序的代码。我必须填写类的 getter 和 setter 以及包含结构,但这是经过测试的工作代码。要获取 List(Of ASNData),只需调用 DataTables.ToList

当然,这适用于任意数量的 Order 元素。

使用结构顺序效果很好。我会使用一个类,但无需更改它即可工作。

此代码的关键部分是 LINQ 查询:

Dim DataTables = From NewDataTable In TestData...<NewDataTable> _
                 Select New ASNData With {.Field = NewDataTable.<Field>.Value, _
                                          .Value = NewDataTable.<Val>.Value, _
                                          .Orders = (From AnOrder In NewDataTable...<Order> _
                                                     Select New ASNData.Order With _
                                                            {.Number = AnOrder.@Number, _
                                                             .ShippingDate = Date.Parse(AnOrder.@ShipDate)}).ToList}

这是完整的工作控制台应用程序:

Module Module1

Sub Main()
    Dim TestData = <NewDataSet>
                       <NewDataTable>
                           <Field>Accepted ASNs</Field>
                           <Val>59</Val>
                           <Order Number="1234" ShipDate="2009/05/21"/>
                           <Order Number="2190" ShipDate="2009/05/22"/>
                           <Order Number="1809" ShipDate="2009/05/22"/>
                       </NewDataTable>
                       <NewDataTable>
                           <Field>Rejected ASNs</Field>
                           <Val>8</Val>
                           <Order Number="2901" ShipDate="2009/05/21"/>
                           <Order Number="2810" ShipDate="2009/05/24"/>
                           <Order Number="1419" ShipDate="2009/05/25"/>
                       </NewDataTable>
                       <NewDataTable>
                           <Field>Missing ASNs</Field>
                           <Val>7</Val>
                           <Order Number="2902" ShipDate="2009/05/19"/>
                           <Order Number="2898" ShipDate="2009/05/20"/>
                           <Order Number="1296" ShipDate="2009/05/22"/>
                       </NewDataTable>
                   </NewDataSet>

    Dim DataTables = From NewDataTable In TestData...<NewDataTable> _
                     Select New ASNData With {.Field = NewDataTable.<Field>.Value, .Value = NewDataTable.<Val>.Value, _
                                                     .Orders = (From AnOrder In NewDataTable...<Order> _
                                                               Select New ASNData.Order With {.Number = AnOrder.@Number, .ShippingDate = Date.Parse(AnOrder.@ShipDate)}).ToList}

    Console.WriteLine(DataTables.Count)
    Console.ReadLine()


End Sub

Public Class ASNData
    Private _field As String
    Private _value As String
    Private _orders As List(Of Order)

    Public Property Field()
        Get
            Return _field
        End Get
        Set(ByVal value)
            _field = value
        End Set
    End Property

    Public Property Value() As String
        Get
            Return _value
        End Get
        Set(ByVal value As String)
            _value = value
        End Set
    End Property

    Public Property Orders() As List(Of Order)
        Get
            Return _orders
        End Get
        Set(ByVal value As List(Of Order))
            _orders = value
        End Set
    End Property

    Structure Order
        Private _number As String
        Private _date As Date

        Public Property Number() As String
            Get
                Return _number
            End Get
            Set(ByVal value As String)
                _number = value
            End Set
        End Property

        Public Property ShippingDate() As Date
            Get
                Return _date
            End Get
            Set(ByVal value As Date)
                _date = value
            End Set
        End Property
    End Structure
End Class


End Module

关于xml - 具有属性的 XML 元素的 LINQ To XML 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/860420/

相关文章:

c# - 列表 A 值与列表 B 中所有可能值的比较

c# - 在解析期间设置命名空间

Python正则表达式问题

xml - 在 XQuery 中创建 map

.net - 格式化负 TimeSpan

.net - VB.NET 中的奇怪 -1.#IND 错误

c# - 如何加入两个列表?

c# - WCF 是否抑制第一次机会异常?

Android - 使用 DOM 解析器的 KML 解析器

asp.net - IIS 经典模式 .NET Web API 调用返回 404 错误