【问题标题】:How to sort children of an element in XmlDocument in C#?如何在 C# 中对 XmlDocument 中元素的子元素进行排序?
【发布时间】:2016-09-25 14:34:10
【问题描述】:

我有一个 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 中对子元素进行排序

【问题讨论】:

    标签: c# xml linq xml-parsing xmldocument


    【解决方案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>
    

    【讨论】:

    • 它的好兄弟。演示似乎工作完美。我要使用这个代码。全部设置好后,我会标记这个答案。感谢您的回复。
    【解决方案2】:

    试试这个 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);
    

    【讨论】:

    • 感谢您的回复。但我真的不知道这段代码会做什么?我在 xDoc 中得到了这个 xml,我只想对其中的组元素进行排序并将其放回 xDoc。
    • 应用 XSLT 应该对 xml 进行排序,然后你必须编写一些其他 XML(这将被排序)
    • 不想写result.xml怎么办?
    • 你可以试试 xml to Linq XDocument ip = XDocument.Load(Server.MapPath("~/data.xml")); var op = ip.Descendants("Column") .Where(node => node.Attribute("IsHidden").Value == "false") .OrderBy(node => int.Parse(node.Attribute("Position" ).Value)) .ToList();
    猜你喜欢
    • 2012-12-26
    • 2011-04-12
    • 2019-09-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-12
    • 2020-05-30
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多