2011-04-26 71 views
1

我遇到了.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"); 

感謝

回答

0

這是因爲XmlReader緩衝來自Stream數據。如果你在Stream的當前位置混亂,你也搞砸了XmlReader ...

+0

謝謝,它奇怪的是,只是讀一個流,然後返回到開始會像這樣搞砸了。我已經做了另一個使用具有相同結果的內存流。我在C++中做過類似的工作,但工作正常嗎? – 2011-04-26 16:00:59

1

亂竄與支持類似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