加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – XmlReader异常处理 – IEnumerable

发布时间:2020-12-15 21:56:26 所属栏目:百科 来源:网络整理
导读:我正在读一个非常大的 XML文件,我必须将其作为流读取,如下所示: public IEnumerablesomething GetStuff(){ foreach(var gzipStream in GetGZips()) { using (var reader = XmlReader.Create(gzipStream,new XmlReaderSettings{ CheckCharacters = false }))
我正在读一个非常大的 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;
}

您应该处理其他可能的例外情况,但不确定您是否正在处理调用它的地方.它不优雅,但后来我不确定你的限制是什么(例如,没有预处理)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读