我目前正在使用 XMLSerializer 来执行 XSD 验证并收集文件中的验证错误。任务是基于包含值集信息、存在信息等的自定义 XSD-s 验证文件。
我的问题如下:使用 XMLReader 时,如果我们将侦听器附加到阅读器的 ValidationEvents(通过 XMLReaderSettings),它会在第一个错误处停止。所以我只是捕获了我记录错误的异常。到目前为止一切都很好,在记录异常后问题开始出现。之后,XMLReader 转到失败字段的结束标记,但由于无法解释的异常,我无法验证下一个字段。
将其付诸实践,这是我捕获异常的代码:
private bool TryDeserialize(XmlSerializer ser, XmlReader read,out object item)
{
string Itemname = read.Name;
XmlReader read2 = read.ReadSubtree();
try
{
item= ser.Deserialize(read2);
return true;
}
catch (Exception e)
{
_ErrorList.Add("XSD error at " + Itemname + ": " + e.InnerException.Message);
item = null;
return false;
}
}
该例程运行良好,但随后出现问题。假设我将以下 XML 片段传递给此代码:
<a>2885</a>
<b>ABC</b>
<c>5</c>
假设“b”可能没有“ABC”作为值,所以我收到 XSD 错误。最后,xmlreader 将位于“EndElement,Name=b”,除非出现异常,否则我根本无法从中移动。如果我执行 xmlreader.read,则会出现以下异常(在此处剪切命名空间):
"e = {"The element 'urn:iso:.....b' cannot contain child element 'urn:iso:.....:c' because the parent element's content model is text only."}"
在此之后,xmlreader 位于'Element,Name=c',所以看起来不错,但是当尝试使用上面的代码对其进行反序列化时,出现以下异常:
'_message = "The transition from the 'ValidateElement' method to the 'ValidateText' method is not allowed."'
我真的不知道我该如何克服它。我试过没有第二个读者阅读子树,但我有同样的问题。请给我一些建议,我真的被卡住了。提前非常感谢!
问候