在将XML转换为JsonString时对XML进行排序

时间:2015-02-27 10:33:58

标签: c# xml sorting json.net

以下是我没有排序

的XML示例
<hierarchy>
<date>2015/02/27 16:37:10</date> 
   <folder name="Root" id="Root">
        <file id="Erstg_20.xlsx" /> 
        <file id="AAERG_20.xlsx" />
      <folder name="Xmdg" id="Xmdg">
        <file id="DatePicker_20.xlsx" /> 
        <file id="Abcd_20.xlsx" />
   </folder>
   <folder name="Axcd" id="Axcd">
        <file id="Zfcd_20.xlsx" />
        <file id="Abcd_20.xlsx" />
   </folder>
</folder>
</hierarchy>

我想以一种方式对其进行排序,即根节点中的所有文件夹都应按升序排序,并且每个节点中的文件应按照其ID进行升序排序

以下是我现在正在做的事情

XmlDocument doc = new XmlDocument();
doc.Load(xmlFilePath);
try {

    string json = JsonConvert.SerializeXmlNode(doc);
    string rJson = json.Replace("@id", "id");
    json = rJson.Replace("@name", "name");
    System.IO.File.WriteAllText(HierarchyJSFilePath, "var jsonStr= " + json + ";");

}

2 个答案:

答案 0 :(得分:1)

例如,您需要将Dictionary序列化为json。

您使用文件夹(您必须编写此类)作为键,并使用文件列表作为值(您还必须对此进行编码)。您可以轻松地对列表和词典进行排序(不要忘记对compareTo方法进行编码)。

答案 1 :(得分:0)

如果XSLT是一个选项,您可能需要使用以下内容:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<!-- default : copy everything as is -->
<xsl:template match='node()  |  @*'>
    <xsl:copy>
        <xsl:apply-templates select="@*  |  node()"/>
    </xsl:copy>
</xsl:template>

<!-- for elements hierarchy and folder : -->
<!-- sort these before copying -->
<xsl:template match="hierarchy | folder">
    <xsl:copy>
        <xsl:for-each select="@*  |  *">
            <xsl:sort select="@id"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

然后使用上面的XSLT样式表(例如“C:\ Temp \ SortAndCopy.xslt”),如下所示:

        // load XML file
        XmlDocument doc = new XmlDocument();
        doc.Load(xmlFilePath);
        // load XSLT file
        var transformation = new XslCompiledTransform();
        transformation.Load(@"C:\Temp\SortAndCopy.xslt");
        // perform transformation with XMLWriter
        // writing to new XML document
        XmlDocument sortedXmlDoc = new XmlDocument();
        using (XmlWriter xw = sortedXmlDoc.CreateNavigator().AppendChild())
        {
          transformation.Transform(doc, null, xw);
          xw.Close();
        }
        // further process sortedXmlDoc ...