我正在读一个非常大的
XML文件,我必须将其作为流读取,如下所示:
public IEnumerable<something> GetStuff() { foreach(var gzipStream in GetGZips()) { using (var reader = XmlReader.Create(gzipStream,new XmlReaderSettings{ CheckCharacters = false })) { reader.MovetoContent(); while (reader.Read()) //<-- Exception here { //Do stuff yield return something; } } } }
我得到一个无效的char异常,处理过程中的一部分:
' ',hexadecimal value 0x19,is an invalid character. Line 655,position 45.
鉴于你不允许在try-catch中产生回报 – 在出现错误的情况下,简单地中止当前Xml doc(并完成枚举)的处理有什么好方法?
try / finally并不好 – 因为异常打破了整个IEnumerable的处理.
我无法对文件执行任何预处理.
解决方法
如果你真的无法进行任何预处理,并且绝对必须在解析XML时生成枚举,那么如果用以下内容替换while循环怎么办?
bool IsMoreXml = true; while (IsMoreXml) { var ValuesRead = null; //not sure what you're reading try { IsMoreXml = reader.Read(); if(!IsMoreXml) break; //Do Stuff ValuesRead = whateverwereadfromxml; } catch (XmlException ex) { //do what you gotta do break; } if(ValuesRead != null) yield return ValuesRead; }
您应该处理其他可能的例外情况,但不确定您是否正在处理调用它的地方.它不优雅,但后来我不确定你的限制是什么(例如,没有预处理)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。