XmlReader.Read和Stream.Read的奇怪行为

时间:2011-04-26 15:14:42

标签: c# xml iostream

我遇到了.Net Framework 3.5和System.Xml.XmlReader类的异常问题。

在我的应用程序调用XmlReader.Read方法之前,它首先使用Stream.Read方法读取流的内容以进行日志记录。然后在调用Stream.Read之前,它会回到流的开头。当我这样做时,我收到以下错误:

Unhandled Exception: System.Xml.XmlException: Unexpected end of file while parsing Name has occurred. Line 1, position 4097.

但是,如果我调用XmlReader.Read,请寻找流的开头,然后调用Stream.Read方法,一切正常。但这似乎只发生在大流上。我刚刚看到一个人通过系统大约2000个字符,它工作正常吗?

我在下面提供了一个代码示例,以便了解我正在做什么。

XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.Schemas.Add(null, args[1]);
readerSettings.ValidationType = ValidationType.Schema;
readerSettings.ValidationEventHandler += new ValidationEventHandler(XmlValidatingReaderValidationEventHandler);

XmlReader reader = XmlReader.Create(fileReader, readerSettings);

byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string content = System.Text.UTF8Encoding.UTF8.GetString(buffer, 0, buffer.Length);
fs.Seek(0, SeekOrigin.Begin);

while(reader.Read());

Console.WriteLine("Done");

由于

2 个答案:

答案 0 :(得分:1)

使用支持XmlReader之类的流来解决这个问题通常是一个坏主意。如果你想用同一个文件做两件事,我建议你打开两个不同的流。这样他们就不会互相干扰。

请注意,使用File.ReadAllText是将文本文件的内容加载到字符串中的更简单方法。

答案 1 :(得分:0)

那是因为XmlReader缓冲了来自Stream的数据。如果你弄乱Stream的当前位置,你也会混淆XmlReader ......