4

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

我真的不知道我该如何克服它。我试过没有第二个读者阅读子树,但我有同样的问题。请给我一些建议,我真的被卡住了。提前非常感谢!

问候

4

1 回答 1

0

您可能需要考虑以下事项:

  • 通常,并不总是可以“收集”所有错误,因为验证解析器可以在发生某些类型的错误时自由放弃验证过程,尤其是那些使验证器处于无法可靠恢复的状态的错误. 例如,验证器在遇到简单类型的约束方面违规后仍可能继续,但如果它在意外内容中运行,它将跳过整个部分。

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

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

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

于 2012-10-24T18:12:48.233 回答