我正在处理的系统使用DataSet.ReadXml(XmlReader)
来读取XML文件并将其内容加载到DataSet
。 XML 文件来自业务伙伴,可能并不总是格式正确,但此系统应对输入执行合理的更正。
我们在 XML 输入文件中看到了错误,例如:
- 情况 1:在字符串值的中间,使用字符,例如
'<'
、'>'
或我最喜欢的'&'
,这会导致">解析时出错 实体名称。第 x 行,位置 y。 - 情况 2:在字符串值的中间,奇怪的结构,例如
"<3"
,使文本描绘了一颗心,这导致">名称不能 以"3"字符开头。第 x 行,位置 y。 - 情况 3:给定编码的字符无效,导致 ">给定编码中的字符无效。第 x 行,位置 y。
如果采用一些简单的规则,则可以通过编程方式解决这些错误:
- 案例 1:将有问题的字符替换为其 XML 字符实体 (
"&"
变得"&"
等。 - 情况 2:将
"<3"
中的"<"
替换为空格,使其变为" 3"
- 情况 3:将无效字符替换为空格
但是,所有这些错误都会引发相同的异常:System.Xml.XmlException
当遇到任何这些错误时,我想采取适当的措施,但最好的方法是什么? 这三个不同的错误都具有相同的HRESULT
值 (-2146232000(,到目前为止,我能够区分它们的唯一方法是检查XmlException.Message
字符串属性。
字符串比较似乎是确定错误确切原因的糟糕方法。如果我遵循这种方法,则在 .NET 的未来版本中异常消息发生更改时,代码将中断。它也不能移植到某些语言。
因此,如何以编程方式区分可以在XmlException
中表示的各种类型的错误?
编辑
在下面的评论中,我收到了有关确保XML数据高质量的重要性的建议。 我不反对,但正如我的问题所说,这超出了我的控制范围,我对此无能为力。因此,尽管你的言论是善意的,但他们没有抓住重点。如果您知道区分System.Xml.XmlException
类可能出现的许多错误的好方法,请分享您的知识。谢谢。
如果您真的想处理非 XML,那么我会尝试使用您要接受的特定非 XML 语法的解析器对其进行预处理,而不是尝试使用 XML 解析器解析非 XML 并捕获错误。在将数据提交到 XML 解析器之前,请通过 Perl 脚本或类似脚本运行它,以识别要转换为 XML 的模式,然后通过 XML 解析器运行结果。