好的,我是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 Jack Loper 0002 Joe Bloggs
我如何设置查询?目前我有这个,但我不知道我到底在做什么:
Dim query = From ex In BookingDatabase.Descendants.Elements("client")
Select id = ex.Attribute("id").Value
For Each ex In query
Console.WriteLine(ex)
Next
如果你能解释每一步,那就太好了。感谢
答案 0 :(得分: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
}