Linq to Xml Группировка по тегам - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть xml, похожий на этот:

<data>
<date>24/11</date>
<info>Info I want to get</info>
<info>Info I want to get</info>
<info>Info I want to get</info>

<date>25/11</date>
<info>Info I want to get</info>
<info>Info I want to get</info>
<info>Info I want to get</info>
</data>

Дело в том, что я могу получить все информационные теги, но я получаю результаты со всех дат.Я не знаю, какие будут даты, так как они генерируются динамически.Я знаю, что у меня может быть тег данных с одним или двумя тегами датыМне бы хотелось, чтобы информация о первой дате отображалась в окне списка, а информация о второй дате - в другом списке.Как я могу это сделать?Желаемый результат:

textbox with the first date

value of tag info related to the first date
value of tag info related to the first date
value of tag info related to the first date

Если есть вторая дата, напечатайте ее тоже:

textbox with the second date

value of tag info related to the second date
value of tag info related to the second date
value of tag info related to the second date

Thx!

1 Ответ

1 голос
/ 25 ноября 2011

Я не знаю, какой тип ListBox (например, Windows Forms, ASP.NET, WPF) вы хотите заполнить, поэтому я просто покажу вам, как сгруппировать этот ввод XML:

    XDocument input = XDocument.Load("../../XMLFile4.xml");
    var groups =
        from info in input.Root.Elements("info")
        group info by info.ElementsBeforeSelf("date").Last() into g
        select new
        {
            date = (string)g.Key,
            infos = (from infoEl in g select (string)infoEl).ToList()
        };

    foreach (var item in groups)
    {
        Console.WriteLine("Date: {0}", item.date);
        foreach (string info in item.infos)
        {
            Console.WriteLine("\t{0}", info);
        }
    }

Выход, например,

Date: 24/11
        Info I want to get
        Info I want to get
        Info I want to get
Date: 25/11
        Info I want to get
        Info I want to get
        Info I want to get
...