我目前正在使用XMLSerializer执行XSD验证并收集文件中的验证错误。任务是基于包含值集信息、存在信息等的自定义XSD对文件进行验证。
我的问题如下:当使用XMLReader时,如果我们通过XMLReaderSettings将侦听器附加到读取器的ValidationEvents上,则它会在第一个错误处停止。因此,我只需捕获异常并记录错误。到目前为止一切都好,问题开始出现在记录异常之后。紧接着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."'
我真的不知道该怎么处理它。我尝试在没有第二个读者阅读子树的情况下进行操作,但我遇到了同样的问题。请给我一些建议,我真的被卡住了。非常感谢您提前的帮助!
问候