使用XML Reader进行XSD验证,收集验证错误(C#)

4

我目前正在使用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."'

我真的不知道该怎么处理它。我尝试在没有第二个读者阅读子树的情况下进行操作,但我遇到了同样的问题。请给我一些建议,我真的被卡住了。非常感谢您提前的帮助!

问候

1个回答

0

您可能需要考虑以下几点:

  • 通常情况下,由于验证解析器在遇到某些类型的错误时会放弃验证过程,特别是那些使验证器无法可靠恢复的错误,因此并不总是可能“收集”所有错误。例如,如果遇到简单类型的约束面违规,验证器仍然可以继续运行,但如果运行到意外内容,则会跳过整个部分。

  • 与解析为DOM不同,其中DOM的加载不受验证读取器失败的影响验证,反序列化为对象则完全不同(或者至少应该是):DOM是关于格式良好;反序列化,即强类型是关于有效性的。

直觉上,如果您遇到验证错误,那么继续进行反序列化和进一步验证有什么意义呢?

尝试独立于反序列化验证您的XML。如果确实使用此方法标记了更多的错误,则上述内容应该可以解释原因。如果没有,则您正在追逐其他东西。


该软件的特定目的是报告所有XSD错误,以便XML的制作者(而不是我)能够进行纠正。当然,在某些情况下,如果XML技术上无法解析,则无法收集错误。但即使在这种情况下,我的软件也必须在此之前收集所有XSD错误,然后报告无法解析性。 - user1771386
现在(因为这篇文章相当古老),我正在使用基于SAX的解决方案进行工作,有效地替换了股票解决方案,因为我没有找到任何合适的东西。这是一个巨大的任务。 :/ - user1771386

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接