我似乎想不出该怎么做。这里还有其他几个示例,但没有什么真正符合我想要做的:
考虑以下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>
如何使用linQ或其他方法根据节点“SortOrder”对此文档进行排序?
排序之后,outerxml基本上应该如下所示:
<Policy>
<Covers>
<MyCover1/>
<MyCover2/>
<MyCover3/>
</Covers>
</Policy>
更新
我已经取得了一些进展,数据现在已经排序,但是如何更新原始的未排序的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个级别:IE
<Policy>
<Covers>
<MyCover1>
<properties>
<sortOrder></sortOrder>
</properties>
<CoverGroup>
<MyCover1Child>
<properties>
<sortOrder></sortOrder>
</properties>
</MyCover1Child>
</CoverGroup>
</MyCover1>
...
</Covers>
上面的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将是更好的选择IMHO.