【问题标题】:Grouping XML with Linq, Hierarchy isn't right用 Linq 分组 XML,层次结构不正确
【发布时间】:2015-01-23 08:16:41
【问题描述】:

我正在尝试研究如何从 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 只能有一个根节点。有什么想法吗?

【问题讨论】:

  • 你没有解释你的 XML 在你的树中是如何显示的,但是我从你的代码中推断如果一个元素有一个属性 ID ,那么它将被显示;否则将显示XElement.Value。对吗?

标签: c# xml linq treeview


【解决方案1】:

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

            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>

这给出了以下输出:

<Holidays>
  <Group ID="2012">
    <Holiday ID="Christmas Eve">
      <Date>12/24/12</Date>
    </Holiday>
    <Holiday ID="Christmas">
      <Date>12/25/12</Date>
    </Holiday>
    <Holiday ID="New Year's Eve">
      <Date>12/31/12</Date>
    </Holiday>
  </Group>
</Holidays>

(请注意,您不能将假日名称用作 XElement 名称,因为某些假日名称包含空格。)

【讨论】:

  • 这产生了我正在寻找的输出。非常感谢您的帮助。
【解决方案2】:

更改您的选择语句...

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

【讨论】:

  • 关闭,但这只会使我的树形视图的第二和第三层成为日期,即“2012 --> 12/24/12 --> 12/24/12”。应该是“2012 --> 平安夜 --> 12/24/12
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-08
  • 2018-02-23
  • 2015-05-14
  • 2013-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多