gpt4 book ai didi

c# 如何读取包含普通文本元素和 xml 文本元素的单个文件

转载 作者:数据小太阳 更新时间:2023-10-29 02:32:16 27 4
gpt4 key购买 nike

我正在从网络服务接收数据流,并试图将流的内容保存到文件中。该流包含标准文本行以及大块 xml 数据(在一行中)。文件大小约为 800Mb。

问题:当我处理每行的 xml 部分时收到内存不足异常。

==start file
line 1
line 2
<?xml version=.....huge line etc</xml>
line 3
line4
<?xml version=.....huge line etc</xml>
==end file

当前代码,如您所见,当它读入巨大的 xml 行时,它会占用内存。

string readLine;
using (StreamReader reader = new StreamReader(downloadStream))
{
while ((readLine = reader.ReadLine()) != null)
{
streamWriter.WriteLien(readLine); //writes to file
}
}

我试图想出一个解决方案,我结合使用 TextReader/StreamReader 和 XmlTextReader 来处理每个部分。当我到达 xml 部分时,我可以切换到 XmlTextReader 并使用 Read() 方法读取每个节点,从而停止内存峰值。

关于我如何做到这一点有什么建议吗?或者,我可以创建一个能够读取这些行的自定义 XmlTextReader?对此有任何指示吗?

已更新

另一个问题是我需要读回这个文件并将两个 xml 部分拆分为单独的 xml 文件!我将解决方案转换为使用二进制写入器写入文件,然后开始使用二进制读取器读回文件。我有文本处理来检测 xml 部分的开始,特别是哪个 xml 部分,以便我可以将它映射到正确的文件!然而,这会导致读取二进制文件和进行检测时出现问题...

using (BinaryReader reader = new BinaryReader(savedFileStream))
{
while ((streamLine = reader.ReadString()) != null)
{
if (streamLine.StartsWith("<?xml version=\"1.0\" ?><tag1"))
//xml file 1
else if (streamLine.StartsWith("<?xml version=\"1.0\" ?><tag2"))
//xml file 2

最佳答案

XML 可能将所有内容包含在一行中,因此您最好使用二进制读取器/写入器,您可以在其中决定读取/写入的大小。

下面的例子,这里我们为每次迭代读取 BUFFER_SIZE 字节:

        Stream s = new MemoryStream();
Stream outputStream = new MemoryStream();
int BUFFER_SIZE = 1024;
using (BinaryReader reader = new BinaryReader(s))
{
BinaryWriter writer = new BinaryWriter(outputStream);
byte[] buffer = new byte[BUFFER_SIZE];
int read = buffer.Length;
while(read != 0)
{
read = reader.Read(buffer, 0, BUFFER_SIZE);

writer.Write(buffer, 0, read);

}

writer.Flush();
writer.Close();
}

我不知道这是否会导致编码等方面的问题,但我认为您必须以二进制形式读取文件。

关于c# 如何读取包含普通文本元素和 xml 文本元素的单个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5678332/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com