2014-01-07 68 views
1

我想用LINQ來獲取一些子元素的值。這裏是XML文件:VB.NET XML Linq獲取後代

<?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 [email protected] = "Chocolate" 
               Select element 
For Each Ele In LinqQuery 
    RichTextBox1.AppendText(Ele.Value & ControlChars.NewLine) 
Next 

其中在文本框中返回

Chocolate BarChocolate ButtonsHot Chocolate 

我怎樣才能得到它單獨返回每個值(並因此把它們放在一個新行)

非常感謝 - 希望這是有道理的,這是我第一次用XML!替代方法也是允許的,更樂意傾聽其他想法和技巧。

+0

是你的文本框設置爲多行? – webdad3

回答

1

問題是,你選擇的配方元素,而不是所有的成分元素。當你輸出一個父元素的Value時,它簡單地連接它所有子元素的文本值,這就是你所看到的。

一個簡單的方法解決這個問題是要改變這一行:

Dim LinqQuery As IEnumerable(Of XElement) = From element In Doc.Descendants 
               Where [email protected] = "Chocolate" 
               Select element 

要這樣:

Dim LinqQuery As IEnumerable(Of XElement) = From element In Doc.Root.Descendants 
               Where [email protected] = "Chocolate" 
               Select element 
+1

完美的作品。我會投票,但沒有足夠的聲望。 – TeknoVenus