我想反序列化XML文件,对其内容进行一些转换,并将其序列化回另一个文件。问题是,我想要反序列化的XML文件有200千兆字节的数据。显然,我无法将其全部反序列化为内存。我要做的是,以块的形式反序列化,转换和序列化数据。 XML模式非常简单:
<root>
<node>
<title>SomeNodeTitle1</title>
<text>Some Node Text 1. A lot of Text.</text>
</node>
<node>
<title>SomeNodeTitle2</title>
<text>Some Node Text 2. A lot of Text.</text>
</node>
<node>
<title>SomeNodeTitle3</title>
<text>Some Node Text 3. A lot of Text.</text>
</node>
<node>
<title>SomeNodeTitle4</title>
<text>Some Node Text 4. A lot of Text.</text>
</node>
</root>
我想要(或多或少)这样的事情:
OpenInputFile();
OpenOutputFile(); // Write root node tag
while(there_are_any_unprocessed_nodes_in_file)
{
List<Node> nodes = TakeNodeChunk();
Transform(nodes); // Let's say remove all "cat" word occurences in text
AppendNodesToOutputXmlFile(nodes);
}
CloseInputFile();
CloseOutputFile(); // Close root node tag
显然我不能使用这种结构:
XmlSerializer serializer = new XmlSerializer(typeof(Root));
StreamReader reader = new StreamReader(filePath);
Root root = (Root)serializer.Deserialize(reader);
reader.Close();
因为它在阅读这么大的文件时会抛出异常。
我该怎么办呢,我可以用什么来实现chunk read ,转换,写?
答案 0 :(得分:0)
您需要手动执行一些工作。 您可以从块中读取文件(如果可能的话,尝试使用chunk≈x2大小的典型节点)。
while (hasSomethingToDo)
{
while (!StringBuffer.Contains("</node>"))
{
StringBuffer += ReadStringFromOutput (bufferSize: 2*TYPICAL_NODE_SIZE)
}
while (StringBuffer.Contains("</node>")) //if node is large, you should optimize here
{
CutStringBuffer(out cuttedPart, out leftover, "<node>", "</node>");
XmlSerializer serializer = new XmlSerializer(typeof(Node));
using (var reader = new StreamReader(cuttedPart))
{
Node node = (Node)serializer.Deserialize(reader);
node = TransformNode(node);
WriteToOuput(node);
}
StringBuffer = leftover;
}
}
答案 1 :(得分:0)