我需要将巨大的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。
答案 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