我似乎无法弄清楚如何做到这一点。这里还有其他一些例子,但没有什么能与我想做的事情相符:
考虑以下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>
我将如何根据节点排序此文档&#34; sortOrder&#34;使用linQ或其他方法?
排序后,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);
}
}
我需要将更改应用回&#34; policyDocument&#34;。注意:封面可以拥有自己的封面组,然后可以再次拥有封面组的封面。这至少下降了4个级别:即
<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)
答案 0 :(得分:2)
您可以尝试如下(使用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));
我在没有测试的情况下编写代码,但我认为应该是一个很好的起点。
答案 1 :(得分:1)
使用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));
答案 2 :(得分:1)
如果您从一开始就使用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将是更好的选择恕我直言。