2013-08-07 50 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);