根据模式文件验证XML后获得错误列表

5

我正在使用XSD模式验证XML文件。到目前为止一切顺利,当验证失败时,代码会生成异常。

        bool isValid = true;
        List<string> errorList = new List<string>();
        try
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.Schemas.Add(null, schemaFilePath);
            settings.ValidationType = ValidationType.Schema;
            XmlDocument document = new XmlDocument();
            document.LoadXml(xml);
            XmlReader rdr = XmlReader.Create(new StringReader(document.InnerXml), settings);
            while (rdr.Read()) { }
        }
        catch (Exception ex)
        {
            errorList.Add(ex.Message);
            isValid = false;
        }

        LogErrors(errorList);
        return isValid;

但是我需要代码在发送到日志之前建立一个所有验证中找到的错误列表,而不总是只显示找到的第一个错误。

有什么想法吗?


你的catch语句没有处理错误。你遇到了什么错误,为什么不对它进行处理呢? - gunr2171
为什么不返回一个异常呢?然后简单地记录它,或者将其放在数组或列表中。 - Hanlet Escaño
异常一次只能持有一个错误,然后退出验证。我想要将所有的错误存储在一个列表中,然后返回以进行处理。上述代码只是我找到的一个示例。 - Rafael
“异常被触发了…” 你所说的异常在哪里?你的catch语句抑制了任何异常。是的,当函数遇到第一个错误时,它会返回false,但你甚至不知道错误是什么! - gunr2171
2
不难理解我想做什么,但是我改了代码。希望现在更容易理解了。 - Rafael
2个回答

14
您可以使用 Validate 方法 与一个 ValidationEventHandler ,您可以按照 MSDN 的方式分别创建 ValidationEventHandler 或者在需要时内联创建。
例如:
    //...Other code above
    XmlDocument document = new XmlDocument();
    document.Load(pathXMLCons);
    document.Validate((o, e) => 
                      { 
                          //Do your error logging through e.message 
                      });

如果您不这样做,将会抛出一个XmlSchemaValidationException异常,并且只有该异常可以被捕获。


很高兴这个答案有所帮助 :) - gitsitgo

3

我尝试了XmlDocument,但在我的情况下失败了。 以下代码应该起作用 参考: C#5.0 in a nutshell

XDocument doc = XDocument.Load("contosoBooks.xml");
XmlSchemaSet set = new XmlSchemaSet();
set.Add(null, "contosoBooks.xsd");
StringBuilder errors = new StringBuilder();
doc.Validate(set, (sender,args) => { errors.AppendLine(args.Exception.Message); });
Console.WriteLine(errors);

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