【问题标题】:Sorting an XDocument based on name of XElement根据 XElement 的名称对 XDocument 进行排序
【发布时间】:2013-02-27 09:40:22
【问题描述】:

我有一个这样的 XML 文件:

 <file name="picture1.jpg"/>
 <file name="file1.txt"/>
 <folder name="subfolder">
      <file name="picture2.jpg"/>
      <file name="file2.txt"/>
      <folder name="anotherfolder">
           <file name="file3.txt"/>
      </folder>
 </folder>
 <folder name="anotherfolder">
 </folder>

需要这样排序:

<folder name="anotherfolder">
 </folder>
 <file name="file1.txt"/>
 <file name="picture1.jpg"/>
 <folder name="subfolder">
      <folder name="anotherfolder">
           <file name="file3.txt"/>
      </folder>
      <file name="file2.txt"/>
      <file name="picture2.jpg"/>
 </folder>

我要排序的代码是:

public static XDocument Sort(XDocument file)
    {
        return new XDocument(Sort(file.Root));
    }
    private static XElement Sort(XElement element)
    {
        XElement newElement = new XElement(element.Name,
            from child in element.Elements()
            orderby child.Name.ToString()
            select Sort(child));
        if (element.HasAttributes)
        {
            foreach (XAttribute attrib in element.Attributes())
            {
                newElement.SetAttributeValue(attrib.Name, attrib.Value);
            }
        }
        return newElement;
    }

它完成了工作......但只是部分。它根据与 FOLDER 分开的名称属性对 FILE 进行排序。我希望将它们一起考虑用于排序的 xml。应该怎么做?

【问题讨论】:

    标签: c# xml sorting linq-to-xml xelement


    【解决方案1】:

    实际上这段代码按名称​​属性对子元素进行排序;它按元素名称排序:

    orderby child.Name.ToString()
    

    您需要做的是获取“名称”属性的值(区分大小写!)。 child.Attribute("name") 可以做到这一点,但是您需要在注意 null 属性的同时获取 .Value ;内联编写代码会有些尴尬。

    我个人觉得这个带有child.Attributes(返回集合)的版本更方便:

    orderby child.Attributes("name").Select(a => a.Value).FirstOrDefault()
    

    【讨论】:

      【解决方案2】:
      .OrderBy(e=>e.Attribute("name").Value)
      

      如果您想排序,请在任何级别递归执行此操作,或者仅在 IEnumerable 的节点上使用此方法对它们进行排序

      【讨论】:

        猜你喜欢
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-03
        • 1970-01-01
        相关资源
        最近更新 更多