使用LINQ对XML进行排序

我想用LINQ对XML文件进行排序。 XML在下面,仅是一个示例。 通常它更大更复杂。 XML应按标题升序排序。 不是整个XML,而是每个parentNode本身。 叶子总是在底部。 文件夹或非叶子位于顶部。 以下XML已经结构良好,但标题的顺序错误。 排序算法还应该替换错误定位的非叶节点。 我已经有一些代码可以完成这项工作,但我想知道是否有更优雅或更短的方式。 目前我必须调用函数递归来进行转换。 也许这可以用另一种方式完成。 谢谢。

刘若英

这是我的XML:

                                                      

这是我的代码:

 using (XmlReader reader = XmlReader.Create(XmlStream)) { XDocument xDoc = XDocument.Load(reader); Action sortXml = null; sortXml = xElement => { bool sortParentNode = false; foreach (var xElem in xElement.Elements()) { if (xElem.HasElements) { // go into deep sortXml(xElem); } else { // break loop and sort parentNode sortParentNode = true; break; } } if (sortParentNode) { xElement.ReplaceNodes(from node in xElement.Elements() orderby node.Attribute("title").Value group node by node.HasElements into folderGroup orderby folderGroup.Key descending select folderGroup); } }; sortXml(xDoc.Root); } 

XML应按标题升序排序。 不是整个XML,而是每个parentNode本身。 叶子总是在底部。 文件夹或非叶子位于顶部。

此解决方案似乎符合您的要求:

 public static void SortXml(XElement node) { node.ReplaceNodes(node.Elements("Node") .OrderBy(x => (string)x.Attribute("leaf")) .ThenBy(x => (string)x.Attribute("title"))); foreach (var childNode in node.Elements("Node")) SortXml(childNode); } ... XDocument doc = XDocument.Load("test.xml"); SortXml(doc.Root); 

所有子节点首先按叶属性的值排序(按字母顺序使用“是”之前的“是”),并按标题次要排序。 以这种方式对所有第一级子节点进行排序,然后使用每个子节点作为输入递归地重复。

输出: