2013-02-27 26 views
1

的名字,我有这样一个XML文件:排序一个XDocument上的XElement

<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分开。我希望他们一起考虑排序的XML。应该做什么?

回答

2

其实这个代码名字属性顺序子元素;它按元素名称

orderby child.Name.ToString() 

你需要做的是让“名”属性的值,而不是(区分大小写!)。这可能与child.Attribute("name"),但你需要得到.Value这一点,同时注意null属性;内联编写代码会有些尴尬。

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

orderby child.Attributes("name").Select(a => a.Value).FirstOrDefault() 
0
.OrderBy(e=>e.Attribute("name").Value) 

做到这一点递归在任何级别的,如果你想排序或只使用节点上的IEnumerable这种方法对它们进行排序