在 C# 中,我需要捕获 XMLException,但我也必须区分它,因为它可以是Xml_InvalidRootData或Xml_UnexpectedEOF。
我怎样才能做到这一点?
那些我只能在调试器中看到别名为“ResString”的字符串。
但我想有多元文化的解决方案,所以字符串比较是我想尽可能避免的事情。
H结果是一样的。
在 C# 中,我需要捕获 XMLException,但我也必须区分它,因为它可以是Xml_InvalidRootData或Xml_UnexpectedEOF。
我怎样才能做到这一点?
那些我只能在调试器中看到别名为“ResString”的字符串。
但我想有多元文化的解决方案,所以字符串比较是我想尽可能避免的事情。
H结果是一样的。
如果你看看
https://referencesource.microsoft.com/#System.Runtime.Serialization/System/Xml/XmlExceptionHelper.cs
你会看到,为了得到一个(可能是本地化的)错误字符串,需要做很多工作,这是new XmlException
.
正如您正确指出的那样,如果您需要区分不同的异常条件以做出一些编程响应,那么这完全没有帮助。
由于您不想检查字符串(这是一个合理的选择),因此最好的选择可能是编写您自己的 XML 解析器,该解析器具有您想要的输出。
仔细考虑这种解析器的设计。您想要的输出不是结构化的 XML,而是解释为什么它不是合法 XML 的详细报告。异常是一种处理异常情况的机制;XML 解析器的设计者认为格式错误的 XML 是一种例外情况;他们认为这种情况几乎不应该发生。由于它几乎从不发生,而且当它发生时,程序对此无能为力,因此没有动力生成详细的报告,允许根据检测到的错误做出程序性决策。
但这显然不是你的情况;您的情况与 XML 解析器的设计者相反。您关心错误,并且希望根据不同的错误执行不同的操作,因此解析器的输出应该是错误报告,而不是XML 语法树。它根本不应该抛出异常,因为在您的场景中,格式错误的 XML 文档并不例外;你期待它。
XML 不是一种特别难以进行 lex 和解析的语言(前提是您还没有尝试解决“此文档是此模式的有效实例吗?”的问题,这是一个更难的问题),因此您应该不会花很长时间生成一个错误检测词法分析器和解析器,特别是因为您有现有 XML 解析器的源代码来指导您。祝你好运!