我已经使用XSD.exe工具创建了一个代表XSD的C#类。 我使用valdiation代码来检查XML与XSD的一致性。 我有这个工作,但使用另一个XML文件会导致异常。
XML文件由外部程序生成,我无权访问原始代码或已发布的XSD。
在反序列化期间读取XML期间,我得到一个例外:
enter System.InvalidOperationException was unhandled
的HResult = -2146233079 Message = Het XML-document(235,17)包含错误。
该错误被描述为尝试将字符串转换为DateTime格式(这不是正确的描述)。
我认为(235,17)migt代表文档中的位置,但这与调用堆栈不一致。
我的问题:你能帮我解决这类问题的良好调试策略吗?我想确切地知道XML中的哪一行发生异常,但不知道如何执行此操作。
答案 0 :(得分:3)
通过IXmlLineInfo
interface实现的XmlTextReader
将行号和字符号报告给异常消息。值得注意的是,line number和line position 都以头号开头(仅在不可用时为零)。
因此"(235, 17)"
是错误抛出时读者所在位置的行号(从1开始)中的行号和位置。在大多数情况下,这将是发生错误的XML文件中的实际位置。但是,有时XML序列化程序会在抛出错误之前将读取器提升到下一个node。从实验:
如果XML格式不正确,那么错误将是行和位置报告的位置。
如果XML格式正确但属性值无法反序列化,那么具有错误值的属性将是行和位置报告的位置。
但是,如果XML格式正确并且元素值无法反序列化,那么XML阅读器已经超出了元素的末尾到下一个的开头XML阅读器节点(通常是打开或关闭的元素),因此引起问题的元素将在报告的位置之前立即,可能在上一行。
如果在(0, 0)
报告错误,则读者无法开始解析XML。可能的问题包括:
string
从StringReader
进行阅读,并且在开头嵌入了BOM。有关详细信息,请参阅XmlReader breaks on UTF-8 BOM。