2012-02-29 92 views
1

请查看XML文件。我想按标签对XML文件进行排序通过XMLElement的InnerText排序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中执行此操作?

+1

你尝试过什么? – 2012-02-29 06:03:32

+0

@Haris Hasan Ohh ...我是XML新手。但我正在尝试:) – Rauf 2012-02-29 06:04:59

回答

5

您是否尝试过,

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

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

+0

您可以使用DataTable.ReadXml()和DataTable.WriteXml()方法。 – 2012-02-29 06:36:46

0

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

那么你就可以得到分类xlements这样

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

使用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"); 
    } 
}