Сортировка файла XML по InnerText из XMLElement - PullRequest
2 голосов
/ 29 февраля 2012

Пожалуйста, посмотрите на файл XML.Я хотел бы отсортировать файл XML по тегу <Order>

<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

Ответы [ 4 ]

8 голосов
/ 17 марта 2012

Вы пробовали,

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);
1 голос
/ 29 февраля 2012

использовать 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");
    }
}
0 голосов
/ 29 февраля 2012

если вы используете 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));
0 голосов
/ 29 февраля 2012

По сути, вам нужно разобрать файл XML в набор записей, отсортировать записи в соответствующем поле, а затем записать результат обратно в виде нового файла XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...