【问题标题】:XSD validation with XML reader, collecting validation errors. (C#)使用 XML 阅读器进行 XSD 验证,收集验证错误。 (C#)
【发布时间】:2012-10-24 14:01:56
【问题描述】:

我目前正在使用 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 sn-p 传递给此代码:

      <a>2885</a>
  <b>ABC</b>
  <c>5</c>

假设“b”可能没有“ABC”作为值,所以我收到 XSD 错误。最后,xmlreader 将位于 '结束元素,名称 = 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."'

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

问候

【问题讨论】:

    标签: xsd xmlreader


    【解决方案1】:

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

      1234563它无法可靠地恢复。例如,验证器在遇到简单类型的约束方面违规后可能仍会继续,但如果它在意外内容中运行,它将跳过整个部分。
    • 与解析为 DOM 不同,其中 DOM 的加载不受验证阅读器失败 validation 的影响,反序列化为对象是(或至少应该是)完全不同的: DOM 是关于形成良好的;反序列化,即强类型是关于有效

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

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

    【讨论】:

    • 该软件的目的是专门报告所有 XSD 错误,以便 XML 的生成者(不是我)能够更正它。在某些情况下,如果 XML 在技术上无法解析,则当然无法收集错误。但即便如此,我的软件也必须在此之前收集所有 XSD 错误,然后报告不可解析性。
    • 现在(因为帖子已经很老了),我正在研究一个基于 SAX 的解决方案,在没有找到任何合适的东西后有效地替换了库存解决方案。这是一项艰巨的任务。 ://
    猜你喜欢
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多