【发布时间】:2017-08-11 01:22:43
【问题描述】:
我正在使用的系统使用DataSet.ReadXml(XmlReader) 读取一个XML 文件并将其内容加载到DataSet。 XML 文件来自业务合作伙伴,可能并不总是格式正确,但该系统有望对输入执行合理的更正。
我们在 XML 输入文件中看到了错误,例如:
- 案例1:在一个字符串值的中间,使用了诸如
'<'、'>'或我最喜欢的'&',这会导致“解析时发生错误 实体名称。第 x 行,位置 y。" - 案例 2:在字符串值的中间,奇怪的结构,例如
"<3"使文本描绘了一颗心,这会导致“Name cannot 以“3”字符开头。第 x 行,位置 y。" - 案例 3:给定编码的字符无效,导致 "给定编码中的字符无效。第 x 行,位置 y。"
如果采用一些简单的规则,这些错误可以通过编程解决:
- 案例 1:将违规字符替换为其 XML 字符实体
(
"&"变为"&amp;",等等。 - 案例2:将
"<3"中的"<"替换为空格,使其变为" 3" - 案例3:用空格替换无效字符
但是,所有这些错误都会引发相同的异常:System.Xml.XmlException
当遇到任何这些错误时,我想采取适当的措施,但最好的方法是什么?这三个不同的错误都具有相同的HRESULT 值(-2146232000),到目前为止,我能够区分它们的唯一方法是检查XmlException.Message 字符串属性。
字符串比较似乎是确定错误确切原因的糟糕方法。如果我遵循这种方法,那么如果异常消息在未来版本的 .NET 中发生更改,代码就会中断。它也不能移植到某些语言。
因此,如何以编程方式区分XmlException 中可能表示的各种类型的错误?
编辑
在下面的 cmets 中,我收到了关于确保 XML 数据具有高质量的重要性的建议。我不反对,但正如我的问题所述,这超出了我的控制范围,我对此无能为力。所以,尽管你的言论是善意的,但他们没有抓住重点。如果您知道区分System.Xml.XmlException 类可能呈现的大量错误的好方法,请分享您的知识。 谢谢。
【问题讨论】:
-
如果您的合作伙伴和规则没有 xml 格式,这是其元素的内容,那么您绝对一直面临这个问题。听起来您总是在等待下一个错误返回。
-
@reds,我同意你的说法。尽管我已经成功解决了很多问题,但现实情况就是这样。
-
我认为你应该对你的项目进行负面测试,希望所有可能的错误都能被捕获和解决。
-
很好......但这无助于回答我的问题。
-
使用 HtmlAgilityPack 而不是逐个节点重建 Xml 怎么样?拒绝无效的 XML 确实没有好的替代品...
标签: c# xml exception xmlexception