3 votes

Tri d'un fichier XML par InnerText d'un XMLElement

Veuillez consulter le fichier XML. Je voudrais trier le fichier XML par <Order> étiquette

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

La réponse sera donc la suivante.

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

Comment puis-je le faire en C# 3.5 ?

9voto

Chuck Savage Points 6106

Avez-vous essayé ?

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

1voto

BLUEPIXY Points 18514

Utiliser XSLT

Par exemple

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

0voto

Vikram Points 5223

Fondamentalement, vous devez analyser le fichier XML en un ensemble d'enregistrements, trier les enregistrements sur le champ approprié, puis réécrire le résultat sous la forme d'un nouveau fichier XML.

0voto

Anton Points 3371

Si vous utilisez using System.Xml.Linq ;

vous pouvez alors obtenir les xéléments triés de la manière suivante

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X