c# – 使用LINQ对XML进行排序

c# – 使用LINQ对XML进行排序,第1张

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

刘若英

这是我的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进行排序所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1216679.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存