我想在解析之前检测XML文档的编码.所以我在*上找到了这个脚本.
public static XElement GetXMLFromStream(Stream uploadStream)
{
/** Remember position */
var position = uploadStream.Position;
/** Get encoding */
var xmlReader = new XmlTextReader(uploadStream);
xmlReader.MoveToContent();
/** Move to remembered position */
uploadStream.Seek(position, SeekOrigin.Begin); // with "pos" = 0 it not works, too
uploadStream.Seek(position, SeekOrigin.Current); // if I remove this I have the same issue!
/** Read content with detected encoding */
var streamReader = new StreamReader(uploadStream, xmlReader.Encoding);
var streamReaderString = streamReader.ReadToEnd();
return XElement.Parse(streamReaderString);
}
但它不起作用.
我总是让EndOfStream成为现实.但它不是!!!! -.-
例如,我有字符串< test>< / test>.
开始:0,结束:13
如果我是ReadToEnd或MoveToContent,则成功到达终点.那么EndOfStream是真的.
如果我通过Seek或Position将位置重置为0(例如),则新的StreamReader显示EndOfStream始终为true.
问题是uploadStream是一个我无法关闭的流.
它是http上传流的SharpZipLib流.所以我无法关闭这个流.我只能使用它.
而坏事只是因为Position和Seek不起作用……只是因为ReadToEnd继续这个位置. – 否则它会起作用.我认为!
也许你可以帮我解决这个问题:-)
非常感谢您提前!
解决方法:
这种方法从根本上与某些类型的输入流不兼容. Streams根本不需要支持Seek.实际上,Stream有一个专门用于检测Seek是否可用的属性,称为CanSeek
. Code需要考虑Seek可能会失败.
简单但不是非常节省内存的方法是将流的内容复制到MemoryStream中.那个人确实支持Seek,然后你可以随心所欲地做任何事情.您使用ReadToEnd()这一事实表明数据不是很大,以至于内存使用会导致问题,因此您可能只需要使用它.
注意:如文档所述,如果不支持Seek,则应该抛出NotSupportedException.它看起来像你正在处理的流实现,它不受支持,但没有正确实现.我希望至少CanSeek会为你返回false,所以你仍然可以可靠地检测到它.