排序的XMLDocument使用LINQ

我似乎无法弄清楚如何做到这一点。 这里对于其他几个例子,但没有什么比赛是我想做的事:

考虑下面的XMLDocument对象:

<Policy> <Covers> <MyCover1> <properties> <sortOrder>1</sortOrder> </properties> </MyCover1> <MyCover3> <properties> <sortOrder>3</sortOrder> </properties> </MyCover3> <MyCover2> <properties> <sortOrder>2</sortOrder> </properties> </MyCover2> </Covers> </Policy>

我会如何在基于节点“中将sortOrder”使用LINQ或其它方法这个文件排序?

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

<Policy> <Covers> <MyCover1/> <MyCover2/> <MyCover3/> </Covers> </Policy>

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”。 注意:盖可以有它自己的覆盖组,然后可以再有它自己的CoverGroups封面。 这种下降至少4个层次:即

<Policy> <Covers> <MyCover1> <properties> <sortOrder></sortOrder> </properties> <CoverGroup> <MyCover1Child> <properties> <sortOrder></sortOrder> </properties> </MyCover1Child> </CoverGroup> </MyCover1> ... </Covers>

该XPATH和foreach以上cathers对于上述的结构,所以我想的也许只是取代了覆盖组的XmlNode与新的排序列表中的第一个的foreach,但我不知道如何重建一个新的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到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 to 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));

分类:C# 时间:2015-03-15 人气:0
本文关键词: LINQ,XML,整理
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.533 (s). 10 q(s)