использование родительских данных xml в операторе выбора LINQ - PullRequest
2 голосов
/ 08 февраля 2010

скажем, у меня есть этот XML:

<items> 
  <item name="thumb"> 
    <downloadStream>test1</downloadStream> 
    <downloadStream>test2</downloadStream> 
    <downloadStream>test3</downloadStream> 
  </item> 
  <item name="photo"> 
    <downloadStream>test5</downloadStream> 
    <downloadStream>test6</downloadStream> 
    <downloadStream>test7</downloadStream> 
  </item> 
</items> 

Я пытаюсь написать оператор LINQ, который преобразует его в следующие строки:

{ "thumb test1",
  "thumb test2",
  "thumb test3",
  "photo test5",
  "photo test6",
  "photo test7", }

Другими словами, он добавляет атрибут из родительского узла во внутреннюю строку каждого дочернего узла.

Это способ, которым я могу использовать один запрос LINQ, чтобы сделать что-то подобное? Я могу найти несколько способов разбить его на несколько этапов, но у меня есть ощущение, что их проще.

Спасибо!

Ответы [ 3 ]

1 голос
/ 08 февраля 2010
XDocument.Load(myXML)
    .Descendants("item")
    .SelectMany(d => d.Descendants()
        .Select(ds => d.Attribute("name").Value + " " + ds.Value));
0 голосов
/ 08 февраля 2010

Вот это в VB.NET. То же самое было бы возможно в C #, но я более знаком с синтаксисом VB.

    Dim itemsXml = <items>
                       <item name="thumb">
                           <downloadStream>test1</downloadStream>
                           <downloadStream>test2</downloadStream>
                           <downloadStream>test3</downloadStream>
                       </item>
                       <item name="photo">
                           <downloadStream>test5</downloadStream>
                           <downloadStream>test6</downloadStream>
                           <downloadStream>test7</downloadStream>
                       </item>
                   </items>
    Dim itemQuery = From ds In itemsXml...<downloadStream> _
                    Select ds.Parent.@name & " " & ds.Value
0 голосов
/ 08 февраля 2010
var list = x.Descendants("item")
            .SelectMany(item => item.Elements("downloadStream")
                                    .Select(e => (string)item.Attribute("name") 
                                                 + " " 
                                                 + (string)e)).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...