【问题标题】:C#: Catch multiple errors during xml validationC#:在 xml 验证期间捕获多个错误
【发布时间】:2017-09-21 01:50:40
【问题描述】:

我已经读到 XmlDocument.Validate 方法不会捕获多个错误:

来自 MSDN:here

如果在验证 XmlDocument 期间发生架构验证错误 部分验证了一些具有正确类型的节点 信息和一些没有。

来自 StackoverFlow:here

这正是 XmlDocument.Validate 方法的预期行为。 一旦发现验证错误,它就会停止验证过程并返回 错误。因此,用户必须修复该错误并再次验证。

此行为不同于 Visual Studio 错误列表。为了 例如,如果您的代码中有一个语法错误,有时它 返回 100 个错误。但实际上你只需要一对一修复 地方。所以,有利有弊,取决于 环境。但是,我认为您无法轻松获得所有 XMLDocument 的验证错误,它以不同的方式工作 天生的。

但是有没有人知道哪个可以捕获验证的所有错误?

【问题讨论】:

  • 一旦发现错误,文档的其余部分不一致,因此无法验证。我确信有一些方法,但它们不能是微不足道的(当然,你不能用XmlDocument.Validate

标签: c# xml


【解决方案1】:

XML Serialisation NuGet package 似乎支持您正在寻找的验证类型。

特别是,它的IsValidXml 方法利用XmlReader(这是一种.NET 类型)来启用多个错误的整理(使用out 参数)。

这里是实现(来自Github source

/// <summary>
/// Validates an XML file against a given XSD schema with validation error messages.
/// </summary>
/// <param name="xmlFileUrl">File location of the XML file to validate.</param>
/// <param name="xmlSchemaFile">File location of the XSD schema to validate the XML file against.</param>
/// <param name="validationErrors">Collection of validation error information objects if the XML file violates the XSD schema.</param>
/// <returns>True if a valid XML file according to the XSD schema, false otherwise.</returns>
public static bool IsValidXml(
    string xmlFileUrl,
    string xmlSchemaFile,
    out IList<Tuple<object, XmlSchemaException>> validationErrors)
{
    var internalValidationErrors = new List<Tuple<object, XmlSchemaException>>();
    var readerSettings = XmlSchemaReader(
        xmlSchemaFile,
        (obj, eventArgs) => internalValidationErrors.Add(
            new Tuple<object, XmlSchemaException>(obj, eventArgs.Exception))
    );

    using (var xmlReader = new XmlTextReader(xmlFileUrl))
    using (var objXmlReader = XmlReader.Create(xmlReader, readerSettings))
    {
        try
        {
            while (objXmlReader.Read()) { }
        }
        catch (XmlSchemaException exception)
        {
            internalValidationErrors.Add(
                new Tuple<object, XmlSchemaException>(objXmlReader, exception));
        }
    }

    validationErrors = internalValidationErrors;

    return !validationErrors.Any();
}

【讨论】:

    【解决方案2】:

    不,XML 序列化 NuGet 包也会在第一个错误时停止。 M$ 根本不知道如何处理 XML,(或任何与技术相关的东西)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-16
      • 2014-06-18
      • 2017-11-07
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多