我是一个 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/