2013-08-07 51 views
4

我正在根据模式xsd验证XML文件。到目前为止,代码在失败的情况下会生成一个异常。根据模式文件验证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; 

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

有什么想法?

+0

你抓不做任何处理错误。你得到的错误是什么,你为什么不对它做任何事情? – gunr2171

+0

为什么不用返回异常呢?然后简单地记录它,或者放在数组或列表中。 –

+0

该例外在当时退出验证时只保留一个错误。我想将所有错误存储在列表中,然后将其返回以进行处理。 上面的代码只是我找到的一个例子。 – Rafael

回答

10

您可以使用ValidatemethodValidationEventHandler。您可以按照MSDN的方式单独创建ValidationEventHandler,或者按需要进行内联。

e.g

//...Other code above 
    XmlDocument document = new XmlDocument(); 
    document.Load(pathXMLCons); 
    document.Validate((o, e) => 
         { 
          //Do your error logging through e.message 
         }); 

如果你不这样做,一个XmlSchemaValidationException会被抛出,只有一个可以被捕获。

+0

谢谢,它完全按我的需要工作。 – Rafael

+0

很高兴答案帮助:) – gitsitgo

1

我试过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);