C# 根据架构文件验证xml后获取错误列表

C# 根据架构文件验证xml后获取错误列表,c#,asp.net,xml,xsd,C#,Asp.net,Xml,Xsd,我正在根据模式xsd验证XML文件。到目前为止,代码在出现故障时会生成一个异常 bool isValid = true; List<string> errorList = new List<string>(); try { XmlReaderSettings settings = new XmlReaderSettings(); settings.Schemas

我正在根据模式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;
bool isValid=true;
List errorList=新列表();
尝试
{
XmlReaderSettings设置=新建XmlReaderSettings();
settings.Schemas.Add(null,schemaFilePath);
settings.ValidationType=ValidationType.Schema;
XmlDocument document=新的XmlDocument();
LoadXml(xml);
XmlReader rdr=XmlReader.Create(新建StringReader(document.InnerXml),设置);
而(rdr.Read()){}
}
捕获(例外情况除外)
{
错误列表。添加(例如消息);
isValid=false;
}
日志错误(错误列表);
返回有效;
但是我需要代码在将其发送到我的日志之前构建一个验证中发现的所有错误的列表,而不是总是只显示第一个发现的错误


有什么想法吗?

您可以将
验证
验证venthandler
一起使用。您可以按照MSDN的方法分别创建
ValidationEventHandler
,或者根据需要内联创建

e、 g


如果不这样做,将抛出一个
XmlSchemaValidationException
,并且只能捕获该异常。

我尝试了XmlDocument,但在我的案例中失败了。 下面的代码应该可以工作 礼貌:简而言之,C#5.0

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);

你的捕获与错误无关。您得到的错误是什么,为什么不处理它?为什么不返回一个异常?然后简单地记录它,或者将其放在数组或列表中。异常在退出验证时只保留一个错误。我想将所有错误存储在一个列表中,然后返回以进行处理。上面的代码只是我发现的一个示例。“异常保持…”您提到的异常在哪里?你的捕获会挤压任何异常。是的,当函数遇到第一个错误时,它将返回
false
,但您甚至不知道错误是什么!理解我想做什么并不难,但我更改了代码。我希望现在更容易理解。很高兴答案有帮助:)
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);