从HUGE Xml转换为Json

时间:2019-07-16 07:11:15

标签: c# json xml

我需要将巨大的Xml转换为Json格式的帮助。

我一直在研究这个话题。我发现了:

How to convert JSON to XML or XML to JSON?

Reading large XML documents in .net

Reading and manpulating large xml of 1 GB

嗯,简单的方法是这样的:

XmlDocument doc = new XmlDocument();
doc.LoadXml(xml);
string jsonText = JsonConvert.SerializeXmlNode(doc);

但是我无法使用它,因为我的文件很大(2GB),所以我得到了OutOfMemoryException

因此,我需要另一种读取大文件的方法。我一直在用这种方式:

    using (XmlReader xr = XmlReader.Create(inputPath))
    {
            while (xr.Read())
            {
                 switch(xr.NodeType)
                 {
                     case XmlNodeType.Element:
                       //Do things
                       break;
                     case XmlNodeType.Text:
                       //Do things
                       break;
                     case XmlNodeType.EndElement:
                       //Do things
                       break;
                 }
            }
     }

我阅读了xml文件,然后将xml从xml转换为json,并按标签串联字符串。但是它很复杂,效率极低,并且无法正常工作。

当我进行研究时,我发现了LINQ to XML。但是我不知道如何使用它。我认为这对于处理和过滤巨大的xml很有好处,但我需要读取整个文件。

我的Xml文件如下:

<?xml version="1.0" encoding="utf-8"?>
<root>
   <key>
      <item> value </value>
      <item> value2 </value>
      <item> value3 </value>
   </key>

   <id>1</id>
   <name>Foo</name>

   <hugeArray> //This array has around 12 millions of entries. Here is my problem.
     <item>
        <direction> </direction>
        <companyId> </companyId>
        <nameId> </nameId>
     </item>
     <item>
        <direction> </direction>
        <companyId> </companyId>
        <nameId> </nameId>
     </item>
      ....
   </hugeArray>
</root>

我发现阵列出现问题。我不知道该如何剪切和阅读它。

我应该如何读取整个文件? 我应该怎么写json?

我正在串联字符,但可以使用JsonWriter类。

更新:

该算法应该能够从任何xml转换为json。

2 个答案:

答案 0 :(得分:2)

尝试推荐的Microsoft技术: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/linq/how-to-perform-streaming-transform-of-large-xml-documents

例如,您有以下部分代码:

                while (reader.Read())  
                {  
                    if (reader.NodeType == XmlNodeType.EndElement)  
                        break;  
                    if (reader.NodeType == XmlNodeType.Element  
                        && reader.Name == "Item")  
                    {  
                        item = XElement.ReadFrom(reader) as XElement;  
                        if (item != null)  
                        {  
                            //here you can get data from your array object
                            //and put it to your JSON stream
                        }  
                    }  
                } 

如果要定义元素的类型,可以检查元素是否具有子元素: How to check if XElement has any child nodes?

与JSON流搭配使用应该很好。有关JSON传输的更多信息,请查看:Writing JSON to a stream without buffering the string in memory

答案 1 :(得分:1)

庞大的文件始终需要使用XmlReader。我在下面的代码中结合使用XmlReader和Xml Linq

--dryrun