VB.NET XML Linq获得后代

时间:2014-01-07 19:57:34

标签: xml vb.net linq

我正在尝试使用LINQ来获取某些子元素的值。这是XML文件:

<?xml version="1.0" standalone="yes"?>
 <UserRecipes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <recipe name="Chocolate" portions="5">
   <ingredient quantity="500" unit="g">Chocolate Bar</ingredient>
   <ingredient quantity="300" unit="g">Chocolate Buttons</ingredient>
   <ingredient quantity="250" unit="g">Hot Chocolate</ingredient> 
  </recipe>
  <recipe name="Cookies" portions="24">
   <ingredient quantity="4" unit="oz">Flour</ingredient>
   <ingredient quantity="200" unit="g">Chocolate Buttons</ingredient>
   <ingredient quantity="600" unit="g">Sugar</ingredient>
  </recipe>
  <recipe name="Cake" portions="22">
   <ingredient quantity="4" unit="oz">Flour</ingredient>
   <ingredient quantity="4" unit="oz">Sugar</ingredient>
   <ingredient quantity="4" unit="oz">Butter</ingredient>
   <ingredient quantity="60" unit="n/a">Eggs</ingredient>
</recipe>
</UserRecipes>

这样做的想法是能够检索特定配方中使用的成分。例如,如果用户选择“巧克力”,那么它将检索“巧克力”配方中使用的所有成分 - 在这种情况下:巧克力棒,巧克力纽扣和热巧克力。

但是,目前,当我执行LINQ查询时,它会将所有这3个值作为一个长字符串返回。例如。巧克力棒巧克力按钮热巧克力。这不是很有用,因为我需要将这些单独添加到我的数据表中(稍后)。

这是我目前拥有的VB.NET代码:

Dim Doc As XDocument = XDocument.Load("G:\Computing\!Recipe Test\XMLTest.xml")
Dim LinqQuery As IEnumerable(Of XElement) = From element In Doc.Descendants
                                                Where element.@name = "Chocolate"
                                                Select element
For Each Ele In LinqQuery
   RichTextBox1.AppendText(Ele.Value & ControlChars.NewLine)
Next

返回

Chocolate BarChocolate ButtonsHot Chocolate

在文本框中。

如何让它分别返回每个值(因此将它们放在一个新行上)

非常感谢 - 希望这是有道理的,这是我第一次使用XML!也允许其他方法,非常乐意倾听其他想法和技巧。

1 个答案:

答案 0 :(得分:1)

问题是您正在选择配方元素而不是所有成分元素。当您输出父元素的Value时,它只是连接所有子元素的文本值,这就是您所看到的。

解决此问题的一种简单方法是更改​​此行:

Dim LinqQuery As IEnumerable(Of XElement) = From element In Doc.Descendants
                                                Where element.@name = "Chocolate"
                                                Select element

对此:

Dim LinqQuery As IEnumerable(Of XElement) = From element In Doc.Root.Descendants
                                                Where element.Parent.@name = "Chocolate"
                                                Select element