使用Linq对XML进行分组,层次结构是不对的

时间:2015-01-22 21:24:19

标签: c# xml linq treeview

我正在尝试研究如何从asp.net C#中的sql查询创建树视图菜单。作为一个学习练习,我有一个包含过去三年假期的数据库 - 我想创建一个显示按年份排序的假期的树视图。例如,“年 - >假日名称 - >假日日期”,其中“ - >”表示层级。

无论如何,我使用此查询从SQL返回作为XML文档的假期:

SELECT  [Year], [Holiday], [Date] FROM [Database] FOR XML PATH('Holiday'), ROOT('Holidays')

当然,这会返回一个没有分组的XML文档,因此我使用Linq按年份对假期进行分组,而数据来自数据库,如下所示:

XmlReader reader = sqlCommand.ExecuteXmlReader();

    if (reader.Read())
    {
        XElement doc = XElement.Load(reader);
        var newData =
            new XElement("Holidays",
                from data in doc.Elements("Holiday")
                group data by (int)data.Element("Year") into groupedData
                select new XElement("Group",
                    new XAttribute("ID", groupedData.Key),
                    from g in groupedData
                    select new XElement("Holiday",
                        g.Element("Name"),
                        g.Element("Date")
                    )
                )
            );

这是更好的:它按年度分组我的假期,但我的树视图最终看起来像这样:

2012
    Holiday
        Christmas Eve
        12/24/12
    Holiday
        Christmas Day
        12/25/12
    Holiday
        New Year's Eve
        12/31/12

......等等。我是Linq的新手,所以我不确定该怎么做。我想摆脱那个“假日”级别,并将实际日期作为假日名称的子节点。我无法对SQL查询做任何事情,因为XML只能有一个根节点。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

由于您的树显然使用ID的{​​{1}}属性作为树节点标签,如果存在这样的属性,您可以将假日名称添加为{{1}的ID属性} node,而不是嵌套属性:

XElement

对于以下输入:

Holiday

这给出了以下输出:

            if (reader.Read())
            {
                var doc = XElement.Load(reader);
                var newData =
                    new XElement("Holidays",
                        from data in doc.Elements("Holiday")
                        group data by (int)data.Element("Year") into groupedData
                        select new XElement("Group",
                            new XAttribute("ID", groupedData.Key),
                            from g in groupedData
                            select new XElement("Holiday", new XAttribute("ID", g.Element("Name").Value), g.Element("Date"))
                        )
                    );
                var newXml = newData.ToString();
                Debug.WriteLine(newXml);
            }

(请注意,您不能将假日名称用作<?xml version="1.0" encoding="UTF-8"?> <Holidays> <Holiday> <Name>Christmas Eve</Name> <Date>12/24/12</Date> <Year>2012</Year> </Holiday> <Holiday> <Name>Christmas</Name> <Date>12/25/12</Date> <Year>2012</Year> </Holiday> <Holiday> <Name>New Year's Eve</Name> <Date>12/31/12</Date> <Year>2012</Year> </Holiday> </Holidays> 名称,因为某些假日名称包含空格。)

答案 1 :(得分:0)

更改您的选择声明...

   select new XElement(
                            g.Element("Name").Value,
                            g.Element("Date")
                        )