C#:在xml验证期间捕获多个错误

时间:2016-03-11 07:43:33

标签: c# xml

我已经读过 XmlDocument.Validate 方法没有捕获多个错误:

来自MSDN:here

  

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

来自StackoverFlow:here

  

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

     

此行为与Visual Studio错误列表不同。对于   例如,如果您在代码中有一个语法错误,有时它   返回100个错误。但实际上你必须只修一个   地点。所以,可能有利有弊取决于   环境。但是,我认为你不能轻易搞定所有   XMLDocument的验证错误,它以不同的方式工作   固有

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

2 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:-1)

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