如何在C#中对XmlDocument中元素的子元素进行排序?

时间:2016-05-27 09:52:37

标签: c# xml linq xml-parsing xmldocument

我是System.Xml.XmlDocument类型的XML文档,如下所示:

<root>

  <group>
    <dog order="1" />
    <cat order="4" />
    <cat order="3" />
    <dog order="7" />
    <dog order="5" />
    <cat order="6" />
    <dog order="2" />
  </group>

  <other/>

</root>

我希望它像

<root>

  <group>
    <dog order="1" />
    <dog order="2" />
    <cat order="3" />
    <cat order="4" />
    <dog order="5" />
    <cat order="6" />
    <dog order="7" />
  </group>

  <other/>

</root>

我在网上尝试了各种代码,但没有一个代码适合我。我还将我的XmlDocument转换为XDocument以使用LINQ,如下所示:

var xDoc = XDocument.Parse(xdoc.OuterXml);

但仍然没有成功。

我需要在组元素XmlDocument

中对子进行排序

2 个答案:

答案 0 :(得分:1)

试试这个XSLT: -

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="/*">
        <xsl:copy>
            <xsl:for-each select="dog">
                            <xsl:sort select="@aa" order="ascending"/>
                    <xsl:copy-of select="."/>
            </xsl:for-each>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet>

然后应用它::

XPathDocument myDocXPath = new XPathDocument(myXml);
XslTransform myXslTrans = new XslTransform();
myXslTrans.Load(myStyleSheet);
XmlTextWriter myWriter = new XmlTextWriter("result.xml",null);
myXslTrans.Transform(myDocXPath, null, myWriter);

答案 1 :(得分:1)

一种选择是删除元素并在排序后再次添加。

XDocument doc  = XDocument.Load(filename);
var elements = doc.Root.Element("group").Elements().ToList();  // Copy the elements.

doc.Root.Element("group").RemoveAll();                         // Remove the elements from the document.
doc.Root.Element("group").Add(elements.OrderBy(x=>int.Parse(x.Attribute("order").Value)));
//Add them again after sorting.

选中此Demo

<强>输出

 <root>
  <group>
    <dog order="1" />
    <dog order="2" />
    <cat order="3" />
    <cat order="4" />
    <dog order="5" />
    <cat order="6" />
    <dog order="7" />
  </group>
</root>