Odd behavior with XmlReader.Read and Stream.Read

Odd behavior with XmlReader.Read and Stream.Read

问题描述:

我遇到了.Net Framework 3.5和System.Xml.XmlReader类的一个不寻常的问题。Odd behavior with XmlReader.Read and Stream.Read

在我的应用程序调用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"); 

感谢

这是因为XmlReader缓冲来自Stream数据。如果你在Stream的当前位置混乱,你也搞砸了XmlReader ...

+0

谢谢,它奇怪的是,只是读一个流,然后返回到开始会像这样搞砸了。我已经做了另一个使用具有相同结果的内存流。我在C++中做过类似的工作,但工作正常吗? – 2011-04-26 16:00:59

乱窜与支持类似XmlReader这样的流通常是一个坏主意。如果你想用同一个文件做两件不同的事情,我建议你打开两个不同的流。这样他们就不会互相干扰。

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

+0

事实上,实际的应用程序并没有处理文件,所以我只是复制了它正在做的事情。如果我随机定位它的指针,我期望这种行为,但是当我回到开始时,它只有在大流的时候才会触发我为奇数 – 2011-04-26 16:05:26

+0

@ daz-fuller:你将它返回到开始,但你不知道它已经做了什么。例如,它可能已经读取了一个字节顺序标记来检测编码。然后你把它重新开始,并且BOM再次出现,这会让它感到困惑...... – 2011-04-26 16:12:25

+0

@ jon-skeet这是一个很好的观点,谢谢 – 2011-04-26 16:33:56