0

好的,我是 LINQ to XML 的新手,需要一些帮助来设置我的查询。我已经用谷歌搜索了几个小时,似乎每个不同的网站都有不同的方法,我真的很困惑。这是我的 XML:

<?xml version = "1.0"?>
<booking>
    <client>
        <id>0001</id>
        <name>Jack Loper</name>
        <numofseats>3</numofseats>
        <seats>C1C2C3</seats>
        <cost>30</cost>
    </client>
    <client>
        <id>0002</id>
        <name>Joe Bloggs</name>
        <numofseats>1</numofseats>
        <seats>D8</seats>
        <cost>10</cost>
    </client>
</booking>

现在,我已经成功地将我的文档加载到 VB 中:

Dim BookingDatabase As XDocument
BookingDatabase = XDocument.Load(My.Application.Info.DirectoryPath & "\Booking_Database.xml")

我希望我的查询的输出是:

0001 杰克洛珀 0002 乔布洛格斯

我将如何设置我的查询?目前我有这个,但我不知道我到底在做什么:

Dim query = From ex In BookingDatabase.Descendants.Elements("client")
                    Select id = ex.Attribute("id").Value
        For Each ex In query
            Console.WriteLine(ex)
        Next

如果你能解释每一步,那就太好了。谢谢

4

1 回答 1

1

您可能已经想出了如何做到这一点,但如果您没有(或将来其他人有同样的问题并在搜索中遇到您的问题),有几种方法可以做到这一点(语法上),但概念是一样的。

您的查询走在正确的道路上,除了您正在寻找一个真正在元素上的属性(“id”)。如果它是一个属性,它看起来像这样:

<client id="00001">

您要做的是返回匿名类型的集合——该类型的每个实例都将保存您告诉它的所有值(在本例中为 id 和 name)。首先是代码:

Dim query = From ex In BookingDatabase.Descendants("client")
            Select New With {
                .id = ex.Element("id").Value,
                .name = ex.Element("name").Value
            }

或者,或者:

Dim query = BookingDatabase.Descendants("client").Select(Function(ex) New With {.id = ex.Element("id").Value, .name = ex.Element("name").Value})

两者都返回相同的东西,一个包含 id 和 name 的匿名类型的集合。

那么这些查询中发生了什么?

首先,BookingDatabase.Descendants("client") is getting a collection of all the客户端节点。

接下来,“Select New With”正在创建一个匿名类型,它将保存您使用以下语句选择的值:

{
  .id = ex.Element("id").Value,
  .name = ex.Element("name").Value
}

最终结果是您获得了这些匿名类型的集合,然后您可以像这样对其进行迭代:

For Each ex in Query
    Console.WriteLine(ex.id + " " + ex.name)
Next

请注意,您编写的代码会显示类似内容,{ id = 0001, name = Jack Loper }因为您只是在使用ex. 使用匿名类型,您可以获得可以使用的属性。

如果你已经定义了一个类,可以这样说:

Public Class Clients

    Public Property ID As String
    Public Property Name As String

End Class

您可以使用以下命令返回一个类型化对象的集合:

Select New Clients With {
     .ID = ex.Element("id").Value,
     .Name = ex.Element("name").Value
}
于 2013-04-28T22:15:47.553 回答