使用linq对XMLDocument进行排序

我似乎无法弄清楚如何做到这一点。 这里还有其他一些例子,但没有什么能与我想要做的完全匹配:

请考虑以下XMLDocument对象:

    1     3     2     

我将如何使用linQ或其他方法基于节点“sortOrder”对此文档进行排序?

排序后,outerxml基本上应该是这样的:

        

UPDATE

我已经取得了一些进展,数据现已排序,但如何更新原始未分类的XmlDocument? 这是我到目前为止:

 private static void DoSort(XmlDocument policyDocument) { foreach(XmlNode coverGroup in policyDocument.SelectNodes("//CoverGroup")) { XDocument test = XDocument.Parse(coverGroup.OuterXml); var sorted = from xe in test.Element("CoverGroup").Elements() let so = xe.Element("properties").Element("displayOrder") let num = (int)so orderby num select xe; var result = new XElement("CoverGroup", sorted); } } 

我需要将更改应用回“policyDocument”。 注意:封面可以有自己的封面组,然后可以再次使用它自己的封面组封面。 这至少下降了4个级别:即

               ...  

上面的XPATH和foreach捕获了上面的结构,所以我想可能只是用新的排序列表替换第一个foreach中的coverGroup XmlNode,但我不知道如何重新构建一个新的XmlNode。 如果我们可以解决这个问题,那么我们可以简单地做到这一点:

 policyDocument.ReplaceChild(coverGroup, mySortedXmlNode) 

如果你从一开始就开始使用XDocument ,那么这样做很容易。 它可以像这样简单:

 XDocument doc = ...; var baseElement = doc.XPathSelectElement("/Policy/Covers"); var sortedElements = baseElement.Elements() .OrderBy(e => (int)e.XPathSelectElement("properties/sortOrder")) .ToList(); // this call may or may not be needed, but just in case... baseElement.ReplaceAll(sortedElements); 

您的文档最终将被排序,您可以保存到您的XML文件或诸如此类的东西。

通常,您不应该将常规DOM XmlDocument与LINQ XDocument API混合使用。 选择其中一个。 LINQ to XML将是更好的选择恕我直言。

您可以尝试如下(使用XDocument,而不是XmlDocument):

 var document = XDocument.Parse( /* the xml string */ ); var sorted = from xe in document.Element("Policy").Element("Covers").Elements() let so = xe.Element("properties").Element("sortOrder") let num = (int)so orderby num select xe; var result = new XElement("Policy", new XElement("Covers", sorted)); 

我在没有测试的情况下编写代码,但我认为应该是一个很好的起点。

使用Linq将xml排序为Xml。

 var doc = XDocument.Parse(xmlString); //the xml string you want to sort var sortedElements = (from x in doc.Descendants("properties") orderby x.Element("sortOrder").Value select new XElement(x.Parent.Name)); var outputResult = new XElement("Policy", new XElement("Covers", sortedElements));