C# Xml 分组以获得更好的可视化效果

标签 c# xml linq

我有这个 xml

<Group>
    <Day name="Mo">
        <title>Foo</title>
    </Day>
    <Day name="Tu">
        <title>Foo</title>
        <title>Bar</title>
    </Day>
    <Day name="We">
        <title>Foo</title>
    </Day>
    <Day name="Su">
        <title>Foo</title>
    </Day>
</Group>

我想用这种方式转换这个 xml

<Group>
    <Day name="Mo,Tu,We,Th,Su"> <!-- notice the repetition of tuesday -->
        <title>Foo</title>
    </Day>
    <Day name="Tu">
        <title>Bar</title>
    </Day>
</Group>

使用 LINQ to XML 获得更好的可视化效果。我知道这两个 xml 从逻辑上讲是不一样的,但我已经实现了我的系统而不关心它。

我一直在尝试使用此 LINQ 查询对元素进行分组

var grp = from d in source.Element("Grp").Elements("Day")
          group d by new { name = d.Attribute("name"), value = d.Elements("title")
           into g
           select g;

但我注意到我获得的 xml 与我开始使用的 xml 有点相同。

关于如何执行此操作的任何想法?

最佳答案

您是按姓名和头衔分组的,因此您获得的唯一唯一组是您已经拥有的组。

您需要按标题对您的名字进行分组,然后您最终会得到包含一堆具有相同标题的名字的分组。

var groupings = from day in doc.Descendants("Day")
                let name = (string)day.Attribute("name")
                from title in day.Elements("title")
                group name by title.Value;

然后您可以使用这些来创建一些新元素:

var elements = from grouping in groupings
               let title = grouping.Key
               let names = string.Join(",", grouping)
               select new XElement("Day",
                   new XAttribute("name", names),
                   new XElement("title", title)
                   );

然后为这些元素创建一个新的容器:

var result = new XDocument(
    new XElement("Group",
        elements
        )
    );

您可以在 this fiddle 中查看工作示例.

关于C# Xml 分组以获得更好的可视化效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33343034/

相关文章:

c# - 如何合并两个 JObject?

c# - "Delegate to an instance method cannot have null ' 这个' "转发事件时

c# - 当 Newtonsoft.JSON 反序列化失败时,有没有办法返回自定义错误?

linq - Linq Join 中的大于条件

c# - Linq Group 通过不采用内部实体

javascript - 为什么我返回的 JSON 响应被方括号 [] 包围?

java - 读取具有不同名称但类型相同的元素列表

java - 使用 XMLStreamReader 在 Java 中解析 XML 时出现问题

java - 在 Java 中使用 XPath 解析 XML

c# - 使用 Left Join 转换 LINQ 内部联接