以下是我没有排序
的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 + ";");
}
答案 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 ...