2015-02-27 1 views
1

Вот образец XML У меня есть свой несортированныйСортировки XML Хотя преобразование его в JsonString

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

Я хочу, чтобы отсортировать его таким образом, чтобы все папки в корневом узле должны быть отсортированы в порядке возрастания и файлы в каждом узел должен быть отсортирован в порядке возрастания их идентификаторы

Вот как я это делаю прямо сейчас

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

Вам необходимо отсортировать XML-документ. Весьма уродливо, потому что ваш xml кажется рекурсивным (внутри папок внутри папок могут быть файлы внутри папок). Внутри одной папки, какой порядок вы хотите между файлами и папками? Все файлы сначала (упорядочены по id), все папки сначала (упорядочены по id), файлы и папки смешаны и упорядочены по id – xanatos

+0

Да, это рекурсивно .. Корневая папка Всегда будет с тем же именем и идентификатором, поэтому сначала я хотите сортировать файлы по их идентификатору в корневой папке, а затем папки в папках и файлах в этих папках. –

+0

Есть ли причина, по которой вы используете SerializeXmlNode вместо использования промежуточного объекта для хранения десериализованного контента, сортировки его с помощью LINQ, а затем преобразования этой структуры в Json? –

ответ

1

Вам нужно, например, чтобы сериализовать словарь в JSON.

Вы используете в качестве ключей класс «Папки» (вы должны это кодировать), а в качестве значений - список файлов (вам также нужно его закодировать). Вы можете легко сортировать списки и словари (не забудьте закодировать методы compareTo).

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 ... 
Смежные вопросы