排序的XMLDocument使用LINQ [英] Sort XMLDocument using linq

查看:158
本文介绍了排序的XMLDocument使用LINQ的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



考虑下面的XMLDocument对象:

 <政策与GT; 
<套和GT;
< MyCover1>
<性状>
<&中将sortOrder大于1< /中将sortOrder>
< /性状>
< / MyCover1>

< MyCover3>
<性状>
将;中将sortOrder→3&下; /中将sortOrder>
< /性状>
< / MyCover3>

< MyCover2>
<性状>
将;中将sortOrder→2&下; /中将sortOrder>
< /性状>
< / MyCover2>
< /封面>
< /政策与GT;



我怎么会去了解的基础上使用LINQ或其它方法节点中将sortOrder这个文件排序?



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

  <政策与GT; 
<套和GT;
< MyCover1 />
< MyCover2 />
< MyCover3 />
< /封面>
< /政策与GT;



更新



我已经取得了一些进展,现在的数据进行排序,但我要如何更新原来无序的XmlDocument?这是我到目前为止有:

 私有静态无效DoSort(XmlDocument的policyDocument)
{
的foreach (XmlNode的覆盖组在policyDocument.SelectNodes(//覆盖组))
{
的XDocument测试= XDocument.Parse(coverGroup.OuterXml);
变种分类从XE =在test.Element(覆盖组)。元素()
让这么= xe.Element(属性)。元素(displayOrder)
让NUM =(INT),所以
排序依据NUM
选择XE;

VAR的结果=新的XElement(覆盖组,排序);
}
}



我要回去更改应用到policyDocument 。注意:盖可以有它自己的覆盖组,然后可以再有它自己的CoverGroups封面。这种下降至少4个层次:即

 <政策与GT; 
<套和GT;
< MyCover1>
<性状>
<&中将sortOrder GT;< /中将sortOrder>
< /性状>
<&覆盖组GT;
< MyCover1Child>
<性状>
<&中将sortOrder GT;< /中将sortOrder>
< /性状>
< / MyCover1Child>
< /覆盖组>
< / MyCover1>

< /封面>





以上cathers的XPATH和foreach对于上述的结构,所以我想的也许只是取代了覆盖组的XmlNode与新的排序列表中的第一个的foreach,但我不知道如何重建一个新的XMLNode。如果我们能想出解决办法,那么我们可以简单地做到这一点:

  policyDocument.ReplaceChild(覆盖组,mySortedXmlNode)


解决方案

如果您曾与一个起步的XDocument 从一开始,这样做本来是很容易。这可能是因为这样做简单:

 的XDocument文档= ...; 
VAR baseElement = doc.XPathSelectElement(/政策/封面);
VAR sortedElements = baseElement.Elements()
.OrderBy(E =>(INT)e.XPathSelectElement(属性/中将sortOrder))
.ToList(); //可以或可以不需要此呼叫,但万一...
baseElement.ReplaceAll(sortedElements);

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



在一般情况下,你不应该混合定期DOM 的XmlDocument 通过LINQ 的XDocument 的API。选择一个或另一个。 LINQ到XML将是好得多的选择恕我直言。


I can't seem to figure out how to do this. There are several other examples on here, but nothing really matches what I want to do:

Consider the following XMLDocument object:

<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>

How would I go about in sorting this document based on node "sortOrder" using linQ or another method?

After the sort the outerxml should basically look like this:

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

UPDATE

I've made some progress, the data is now sorted, but how do I update the original unsorted XmlDocument? This is what I have so far:

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);
    }
}

I need to apply the changes back to "policyDocument". Note: A cover can have a CoverGroup of it's own, which can then again have Covers with CoverGroups of it's own. This goes down at least 4 levels: ie

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

The XPATH and foreach above cathers for the above structure, so I was thinking of maybe just replacing the coverGroup XmlNode in the first foreach with the new sorted list, but I dont know how to reconstruct a new XmlNode. IF we can figure this out, then we can simply do this:

policyDocument.ReplaceChild(coverGroup, mySortedXmlNode)

解决方案

If you had started off with an XDocument from the start, doing this would have been easy. It could be as simple as doing this:

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);

Your document would end up being sorted and you could save to your XML file or whatnot.

In general, you shouldn't be mixing the regular DOM XmlDocument with the LINQ XDocument API's. Choose one or the other. LINQ to XML will be the much nicer choice IMHO.

这篇关于排序的XMLDocument使用LINQ的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆