具有属性的XML元素的LINQ To XML语法 [英] LINQ To XML Syntax for XML Element with Attributes

查看:54
本文介绍了具有属性的XML元素的LINQ To XML语法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm a bit of a LINQ newbie and I was having some trouble with the following. I'm trying to perform a query using LINQ on an XML file and store the results in a list of DataClass objects that match the XML.

我有一个这样定义的XML文件:

I've got an XML file that is defined like this:

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

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

I have created a Data class to support this XML format. What I would like to do is create a LINQ Query to grab these 3 records and store them into a List of my DataClass.

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

In order to support multiple Order elements, I have my class defined with a generic list of "Order" structs... It looks like this:

    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个order元素并将其存储到我的Order结构列表中.

The biggest issue I'm having is figuring out how to grab the 3 order elements and store them into my list of Order structs.

有人可以为此指出正确的方向吗?

Can anyone point me in the right direction on this?

谢谢.

推荐答案

这是带有所需LINQ查询的控制台应用程序的代码.我必须填写您的类的getter和setter并包含结构,但这是经过测试的工作代码.要获取ASNData的列表,只需调用DataTables.ToList

Here is the code for a Console application with the LINQ query you need. I had to fill in the getters and setters of your class and containing structure, but this is tested working code. To get a List(Of ASNData) just call DataTables.ToList

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

Of course this will work with any number of Order elements.

使用结构订单可以正常工作.我将使用Class,但是无需更改它即可工作.

Using Structure Order works just fine. I would use a Class, but no need to change it for this to work.

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

The key part of this code is the LINQ query:

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}

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

Here is the complete working console app:

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元素的LINQ To XML语法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆