2014-01-07 5 views
1

Я пытаюсь использовать LINQ для получения значений некоторых дочерних элементов. Вот XML-файл:VB.NET XML Linq Get Descendants

<?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 значения в виде одной длинной строки. Например. Шоколад Бар Шоколад ButtonsHot Шоколад. Это не очень полезно, потому что мне нужны эти отдельные, чтобы добавить к моему datatable (позже).

Вот код 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

ваша TextBox установлен в многострочно? – 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

Смежные вопросы