如何跳过 XML 反序列化中引发错误的对象?

2023-12-02

我正在对非常大的 XML 文档(有时超过 200MB)使用 XML 反序列化。大多数文档都运行得很好,但有时反序列化函数会抛出错误。

例如:

  • 当整数是字符串时,您会收到“格式错误”
  • 当无法识别指定的类型时,您会收到错误。
Input string was not in a correct format.
   at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
   at System.Number.ParseUInt32(String value, NumberStyles options, NumberFormatInfo numfmt)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read208_Item(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read209_Item(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read210_Item(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read211_Item(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read212_Item(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read213_Item(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read228_TrailInformation(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read237_FeatureCollectionFeatureMember(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read238_FeatureCollection(Boolean isNullable, Boolean checkType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderFeatureCollection.Read239_FeatureCollection()

这些错误没有问题(我知道如何处理它们),将来我们很可能会遇到我们现在无法预见的其他错误。

我怎样才能告诉 XMLSerializer 继续并跳过这些错误?

我尝试了自定义事件处理程序,但它们不起作用。

我也许能够读取错误消息,然后删除出现错误的行,但这是一种非常令人讨厌的方式(请参阅下面的解决方法)!

Code:

try
{
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(FeatureCollection));
    xmlSerializer.UnknownElement += new XmlElementEventHandler(Serializer_ElementEvent);
    xmlSerializer.UnknownAttribute += new XmlAttributeEventHandler(Serializer_AttributeEvent);
    xmlSerializer.UnknownNode += new XmlNodeEventHandler(Serializer_NodeEvent);
    xmlSerializer.UnreferencedObject += new UnreferencedObjectEventHandler(Serializer_UnreferencedObjectEvent);

    StringReader reader = new StringReader(xmlstring);
    Message = (FeatureCollection)xmlSerializer.Deserialize(reader); // This is where the exception takes place
}
catch (Exception e)
{
    System.Windows.MessageBox.Show("Something went wrong.", "Error", System.Windows.MessageBoxButton.OK);
    return;
}

解决方法(正在进行中):

int tries = 1;
while (true)
{
    try
    {
        Bericht = (FeatureCollection)xmlSerializer.Deserialize(reader);
    }
    catch(Exception e)
    {
        if(tries >= 100)
        {
            throw e;
        }
        Exception innerException = e.InnerException;
        
        // REGEX linenumber innerException.Message; -> Error in XMLDocument (221, 6)
        // REMOVE LINE from source

        tries++;
        continue;
    }
    break;
}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何跳过 XML 反序列化中引发错误的对象? 的相关文章

随机推荐

  • Python strptime 芬兰语

    我有一个日期的芬兰表示 蒂斯塔纳 27 lokakuuta 2015 我需要将其转换为日期时间对象 但是 Python 中的日期时间库无法识别日期和月份名称 我希望像下面这样的东西能够工作 import locale from dateti
  • 是否可以拦截应用程序卸载?

    是否可以拦截应用程序卸载并进行一些工作 例如 我的应用程序修改了设备的一些文件 因此在卸载我的应用程序所做的回滚更改之前会很整洁 有什么提示 想法吗 你在谈论类似的问题吗 应用程序卸载前收听广播 然后如上所述 您必须使用上面链接中给出的意图
  • 通过 PIP 安装 pyautogui 时获取“encoding”是此函数的无效关键字参数”

    当我尝试将 pyautogui 库安装到 python 时 出现此错误 请在下面找到详细信息 ERROR Complete output from command python setup py egg info ERROR Traceba
  • pandas - 按部分字符串分组

    我想按部分子字符串对 DataFrame 进行分组 这是一个示例 csv 文件 GridCode Key 1000 Colour 1000 Colours 1001 Behaviours 1001 Behaviour 1002 Favour
  • selenium webdriver C# 多线程

    Selenium WebDriver 支持多线程吗 我尝试在打开 2 4 个窗口的情况下使用它 看起来浏览器窗口 Firefox 有时会被冻结 当一个线程启动时 driver FindElement By Id id SendKeys My
  • Django 复杂注释

    先决条件 查询集必须返回Articles 查询集必须返回唯一的对象 不得使用访问数据库的 for 循环 意味着对要注释的 N 个对象进行 N 个查询 我的模型 class Report BaseModel ios report JSONFi
  • 是否可以在 Node.js 上使用 UDP 来保证消息的传递?

    如何在 Node js 上使用 UDP 保证消息的传递 例如 如果数据包失败 我可以重新发送数据包 但有没有办法识别它何时失败 另外 数据包丢失有多常见 如果您真正想知道的是 如何检测丢失的数据包 那么一般的技术是让接收方对发送的每个数据包
  • ng-options 在另一个下拉列表中按值过滤

    这似乎是一个非常简单的代码 但我无法弄清楚为什么它不起作用 我想按所选的 品牌 过滤 型号 下拉列表 Make
  • 如何在 webview 组件中检索 Javascript 函数值

    如何从 webview 组件中加载的网页中检索 Javascript 函数值 你不能直接 您可以通过以下方式调用 Javascript 函数loadUrl javascript where 是你的函数调用 但是 您无法通过这种方式得到结果
  • 从 API 网关调用时,Cloudwatch Logs PutLogEvents 操作失败,并出现 com.amazon.coral.service#UnknownOperationException

    我使用 API Gateway 的 AWS 服务集成类型通过 PutLogEvents 操作将日志添加到 Cloudwatch Logs 服务 如下所述 https docs aws amazon com AmazonCloudWatchL
  • 为什么在将临时变量传递给线程函数时移动构造函数会被调用两次? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我无法理解为什么类的移动构造函数被调用两次 因为我的线程函数通过右值引用获取参数 所以我希望当参数移动到线程构造函数时 移动构造函数只会被调用一次 有人可以给出关于线程构造函数如何工作以及如何将参
  • linux 杀死命令 -9 与 -15

    我有一个进程想要终止然后重新启动服务 有人编写了通过编写以下脚本集来终止进程的代码 ps ef grep process name awk print kill 15 2 gt projects test kill sh run the k
  • 控制守护进程和应用程序的差异

    关于这篇优秀的文章 nohup 和守护进程有什么区别 我想问以下问题 从我的终端启动应用程序后 该应用程序会在后台或前台继续运行 我唯一能与之交互的就是从我的终端向其发送信号 假设标准输入仍然存在 然而 在启动守护进程后 我意识到可以通过其
  • 使用 shape-outside 包裹图像时如何将图像与文本底部对齐

    我一直在玩弄 shape outside 并在这里工作了一个示例 http www thelionscall com wp content Temp wrap test html element shape outside url http
  • XMLRPC 显示 -32601 错误(使用 PHP)

    我有以下代码
  • 使用 OpenCV 的 Heroku NodeJS 应用

    我尝试了很多构建包并在 google 上搜索了很多文章 但我就是无法部署我的 NodeJS 应用程序 所有构建包都已过时 2 年以上 而且都不起作用 到目前为止 我尝试了以下构建包 https github com zachlatta he
  • 增加 WordPress 的最大上传限制

    我需要将 PDF 文件上传到我的WordPress 网站 当我去上传新媒体 然后尝试上传它 它说 FileName pdf 超出了该网站的最大上传大小 我尝试查找 php ini 文件 但找不到它 我跑了phpinfo 通过创建一个新文件
  • 如何读取 MIT/GNU 方案中的文本文件?

    我一直在学习 SICP 我想应用我迄今为止学到的一些概念 也就是说 积累 映射和过滤将帮助我提高工作效率 我主要使用 CSV 文件 并且我知道 MIT GNU 方案不支持这种文件格式 但这没关系 因为我可以将 CSV 文件导出到 txt 文
  • 如何在sql server中将字符串转换为查询

    如何添加包含 And 子句的字符串 但是当我们应用查询该字符串时 该字符串将被视为查询并满足所有和条件我有一个查询 例如 Declare WhereQuery varchar max SET WhereQuery class BCA and
  • 如何跳过 XML 反序列化中引发错误的对象?

    我正在对非常大的 XML 文档 有时超过 200MB 使用 XML 反序列化 大多数文档都运行得很好 但有时反序列化函数会抛出错误 例如 当整数是字符串时 您会收到 格式错误 当无法识别指定的类型时 您会收到错误 Input string