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;

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

有什么想法吗?

4

2 回答 2

13

您可以将该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 
                      });

如果你不这样做,aXmlSchemaValidationException将被抛出,只有那个可以被抓住。

于 2013-08-07T20:15:51.777 回答
1

我尝试了在我的情况下失败的 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);
于 2017-05-31T12:18:26.697 回答