【问题标题】:Sorting of XML file by XMLElement's InnerText通过 XMLElement 的 InnerText 对 XML 文件进行排序
【发布时间】:2012-03-18 15:40:10
【问题描述】:

请查看 XML 文件。我想通过<Order>标签对XML文件进行排序

<MyRootNode>
  <Tab>
    <Name>ABC</Name>
    <Order>200</Order>
  </Tab>
  <Tab>
    <Name>MNO</Name>
    <Order>100</Order>
  </Tab>
  <Tab>
    <Name>XYZ</Name>
    <Order>90</Order>
  </Tab>
  <Tab>
    <Name>QWE</Name>
    <Order>40</Order>
  </Tab>
  <Tab>
    <Name>KML</Name>
    <Order>20</Order>
  </Tab>
</MyRootNode>

所以答案如下。

<MyRootNode>
  <Tab>
    <Name>KML</Name>
    <Order>20</Order>
  </Tab>
  <Tab>
    <Name>QWE</Name>
    <Order>40</Order>
  </Tab>
  <Tab>
    <Name>XYZ</Name>
    <Order>90</Order>
  </Tab>
  <Tab>
    <Name>MNO</Name>
    <Order>100</Order>
  </Tab>
  <Tab>
    <Name>ABC</Name>
    <Order>200</Order>
  </Tab>
</MyRootNode>

如何在 C# 3.5 中做到这一点?

【问题讨论】:

  • 你有没有尝试过?
  • @Haris Hasan Ohh... 我是 XML 新手。但我正在尝试:)

标签: c# xml sorting


【解决方案1】:

你试过了吗,

XElement root = XElement.Load(xmlfile);
var orderedtabs = root.Elements("Tab")
                      .OrderBy(xtab => (int)xtab.Element("Order"))
                      .ToArray();
root.RemoveAll();
foreach(XElement tab in orderedtabs)
    root.Add(tab);
root.Save(xmlfile);

【讨论】:

    【解决方案2】:

    使用 XSLT

    例如:

    dataSort.xslt:

    <?xml version="1.0" encoding="UTF-8"?> 
    <xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes" />
    <xsl:template match="/">
        <xsl:element name="MyRootNode">
            <xsl:apply-templates select="MyRootNode" />
        </xsl:element>
    </xsl:template>
    
    <xsl:template match="MyRootNode">
        <xsl:for-each select="Tab">
            <xsl:sort select="Order/text()" data-type="number"/>
                <xsl:copy-of select="." />
        </xsl:for-each>
    </xsl:template>
    </xsl:stylesheet>
    

    Sample.cs:

    //convert data.xml to sortedData.xml
    
    using System;
    using System.Xml.Xsl;
    
    class Sample {
        static public void Main(){
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load("dataSort.xslt");
            xslt.Transform("data.xml", "sortedData.xml");
        }
    }
    

    【讨论】:

      【解决方案3】:

      基本上,您需要将 XML 文件解析为一组记录,对相应字段的记录进行排序,然后将结果作为新的 XML 文件写回。

      【讨论】:

      • 您可以使用 DataTable.ReadXml() 和 DataTable.WriteXml() 方法。
      【解决方案4】:

      如果你使用 使用 System.Xml.Linq;

      那么你就可以像这样得到排序的元素了

      var xnodes = oldXDoc.Element("MyRootNode").Elements();
      var sortedXNodes = xnodes.OrderBy(node => Convert.ToInt32( node.Element("Order").Value));
      var newXdoc = new XDocument(new XElement("MyRootNode", sortedXNodes));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-24
        • 2017-07-12
        • 1970-01-01
        • 2011-02-16
        • 1970-01-01
        相关资源
        最近更新 更多