我已经有一些代码可以完成这项工作,但我想知道是否有更优雅或更短的方式.目前我必须调用函数递归来进行转换.也许这可以用另一种方式完成.
谢谢.
刘若英
这是我的XML:
<Node title="text99" leaf="no"><Node title="text98" leaf="no"> <Node title="text97" leaf="no"> <Node title="text96" leaf="yes"/> <Node title="text95" leaf="yes"/> </Node> <Node title="text94" leaf="no"> <Node title="text93" leaf="yes"/> <Node title="text92" leaf="yes"/> </Node> <Node title="text91" leaf="yes"/> <Node title="text90" leaf="yes"/></Node><Node title="text89" leaf="no"> <Node title="text88" leaf="no"> <Node title="text87" leaf="yes"/> <Node title="text86" leaf="yes"/> </Node> <Node title="text85" leaf="no"> <Node title="text84" leaf="yes"/> <Node title="text83" leaf="yes"/> </Node> <Node title="text82" leaf="yes"/> <Node title="text81" leaf="yes"/></Node><Node title="text80" leaf="no"> <Node title="text79" leaf="no"> <Node title="text78" leaf="no"> <Node title="text78" leaf="yes"/> <Node title="text77" leaf="yes"/> </Node> <Node title="text76" leaf="no"> <Node title="text75" leaf="yes"/> <Node title="text74" leaf="yes"/> </Node> <Node title="text73" leaf="yes"/> <Node title="text72" leaf="yes"/> </Node> <Node title="text71" leaf="no"> <Node title="text70" leaf="no"> <Node title="text69" leaf="yes"/> <Node title="text68" leaf="yes"/> </Node> <Node title="text67" leaf="no"> <Node title="text66" leaf="yes"/> </Node> <Node title="text65" leaf="yes"/> <Node title="text64" leaf="yes"/> </Node> <Node title="text63" leaf="yes"/> <Node title="text62" leaf="yes"/></Node><Node title="text61" leaf="yes"/><Node title="text60" leaf="yes"/>
这是我的代码:
using (XmlReader reader = XmlReader.Create(XmlStream)){ Xdocument xDoc = Xdocument.Load(reader); Action<XElement> 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); }解决方法
The XML should be sorted by Title,
ascending. Not the whole XML at once,
but every parentNode for itself. Leafs
are always at the bottom. Folder or
non-leafs are at the top.
此解决方案似乎符合您的要求:
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);
所有子节点首先按叶属性的值排序(按字母顺序使用“是”之前的“是”),并按标题次要排序.以这种方式对所有第一级子节点进行排序,然后使用每个子节点作为输入递归地重复.
输出:
<Node title="text99" leaf="no"> <Node title="text80" leaf="no"> <Node title="text71" leaf="no"> <Node title="text67" leaf="no"> <Node title="text66" leaf="yes" /> </Node> <Node title="text70" leaf="no"> <Node title="text68" leaf="yes" /> <Node title="text69" leaf="yes" /> </Node> <Node title="text64" leaf="yes" /> <Node title="text65" leaf="yes" /> </Node> <Node title="text79" leaf="no"> <Node title="text76" leaf="no"> <Node title="text74" leaf="yes" /> <Node title="text75" leaf="yes" /> </Node> <Node title="text78" leaf="no"> <Node title="text77" leaf="yes" /> <Node title="text78" leaf="yes" /> </Node> <Node title="text72" leaf="yes" /> <Node title="text73" leaf="yes" /> </Node> <Node title="text62" leaf="yes" /> <Node title="text63" leaf="yes" /> </Node> <Node title="text89" leaf="no"> <Node title="text85" leaf="no"> <Node title="text83" leaf="yes" /> <Node title="text84" leaf="yes" /> </Node> <Node title="text88" leaf="no"> <Node title="text86" leaf="yes" /> <Node title="text87" leaf="yes" /> </Node> <Node title="text81" leaf="yes" /> <Node title="text82" leaf="yes" /> </Node> <Node title="text98" leaf="no"> <Node title="text94" leaf="no"> <Node title="text92" leaf="yes" /> <Node title="text93" leaf="yes" /> </Node> <Node title="text97" leaf="no"> <Node title="text95" leaf="yes" /> <Node title="text96" leaf="yes" /> </Node> <Node title="text90" leaf="yes" /> <Node title="text91" leaf="yes" /> </Node> <Node title="text60" leaf="yes" /> <Node title="text61" leaf="yes" /></Node>总结
以上是内存溢出为你收集整理的c# – 使用LINQ对XML进行排序全部内容,希望文章能够帮你解决c# – 使用LINQ对XML进行排序所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)