c# - Linq-to-xml 按没有子元素的元素分组

标签 c# .net linq linq-to-xml

我想知道是否有人可以在以下方面提供帮助:

我有一个这样的 xml 文档:

<div class="_cl">element description 1</div>
<div class="_cl">
    <anotherele>dtls</anotherele>
    <anotherele>moredtls</anotherele>
</div>
<div class="_cl">
    <anotherele>dtls</anotherele>
    <anotherele>moredtls</anotherele>
</div>
<div class="_cl">element description 2</div>
<div class="_cl">
    <anotherele>dtls</anotherele>
    <anotherele>moredtls</anotherele>
</div>
<div class="_cl">
    <anotherele>dtls</anotherele>
    <anotherele>moredtls</anotherele>
</div>

我想知道 linq 中是否有任何方法可以按没有子元素的元素对其进行分组。基本上,尝试以某种方式构建文档:

<div class="_cl">element description 1
   <div class="_cl">
       <anotherele>dtls</anotherele>
       <anotherele>moredtls</anotherele>
   </div>
   <div class="_cl">
       <anotherele>dtls</anotherele>
       <anotherele>moredtls</anotherele>
   </div>
</div>
<div class="_cl">element description 2
   <div class="_cl">
       <anotherele>dtls</anotherele>
       <anotherele>moredtls</anotherele>
   </div>
   <div class="_cl">
       <anotherele>dtls</anotherele>
       <anotherele>moredtls</anotherele>
   </div>
</div>

我第一次糟糕的尝试是这样的:

var n = from a in doc.Descendants()
                where a.Name.LocalName == "div" && (string)a.Attribute("class") == "_cl"
                group a by a.Value.Length<50 into g 
                select new { k = g.Key, p = g.Count() };

希望这是有道理的,并提前致谢。

斯图

最佳答案

这里是一个例子,假设输入是

<body>
<div class="_cl">element description 1</div>
<div class="_cl">
  <anotherele>dtls</anotherele>
  <anotherele>moredtls</anotherele>
</div>
<div class="_cl">
  <anotherele>dtls</anotherele>
  <anotherele>moredtls</anotherele>
</div>
<div class="_cl">element description 2</div>
<div class="_cl">
  <anotherele>dtls</anotherele>
  <anotherele>moredtls</anotherele>
</div>
<div class="_cl">
  <anotherele>dtls</anotherele>
  <anotherele>moredtls</anotherele>
</div>
</body>

然后是代码

    XDocument input = XDocument.Load("input.xml");

    XDocument output = new XDocument(
        new XElement(input.Root.Name,
            from el in input.Root.Elements()
            where el.Elements().Any()
            group el by el.NodesBeforeSelf().OfType<XElement>().LastOrDefault(e => !e.Elements().Any()) into g
            select new XElement(g.Key.Name,
                g.Key.Attributes(),
                g.Key.Nodes(),
                g)
            ));

    output.Save(Console.Out);

输出

<body>
  <div class="_cl">element description 1<div class="_cl"><anotherele>dtls</anoth
erele><anotherele>moredtls</anotherele></div><div class="_cl"><anotherele>dtls</anotherele><anotherele>moredtls</anotherele></div></div>
  <div class="_cl">element description 2<div class="_cl"><anotherele>dtls</anoth
erele><anotherele>moredtls</anotherele></div><div class="_cl"><anotherele>dtls</anotherele><anotherele>moredtls</anotherele></div></div>
</body>

我想这就是您想要的,除了缩进。至于缩进,您可以通过使用 XDocument.Load("input.xml", LoadOptions.PreserveWhitespace) 加载输入来更接近您想要的结果。

有关此分组方法的更多信息,请参阅 http://msmvps.com/blogs/martin_honnen/archive/2009/11/27/grouping-with-linq-to-xml.aspx .

关于c# - Linq-to-xml 按没有子元素的元素分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8169885/

相关文章:

c# - Entity Framework 查询中 && 和 where 条件的区别

c# - 支持回调或事件的商业 .net 任务调度程序组件

c# - 自定义 XSD 类型的 Xml 序列化

c# - 在 C# 中获取 unicode 目录名称?

c# - 匹配评论相同餐厅的用户

c# - 将字符串转换为 IEnumerable<object>

c# - 在 C# 中实现部分递归函数

c# - 在 Raspberry Pi 上 dockerize .net core mvc 应用程序后,wwwroot 文件夹中没有静态文件

c# - ftpwebrequest.getresponse 抛出 550 拒绝访问

c# - 如何在 FileHelpers 上进行自定义验证?