2013-07-19 54 views
0

我有這樣的代碼來驗證我的XML:如何知道哪些XML文件驗證失敗

private bool ValidateXML(string filePath) 
{ 
    try 
    { 
     XmlDocument xmld = new XmlDocument(); 
     xmld.Load(filePath); 
     xmld.Schemas.Add(null, @"C:\...\....xsd"); 
     xmld.Validate(ValidationEventHandler); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 

static void ValidationEventHandler(object sender, ValidationEventArgs e) 
{ 
    switch (e.Severity) 
    { 
     case XmlSeverityType.Error: 
      Debug.WriteLine("Error: {0}", e.Message); 
      break; 
     case XmlSeverityType.Warning: 
      Debug.WriteLine("Warning {0}", e.Message); 
      break; 
    } 
} 

但是,當我在電話回來我怎麼知道失敗的文件的文件路徑?我想將它移動到「失敗」文件夾,但不知道哪一個是我不能。

+1

'sender'對象是什麼類型?也許你可以從那裏檢索一些信息... – marsze

+1

也許寧可使用這種方式:http://stackoverflow.com/questions/4584080/schema-validation-xml – marsze

+0

@marsze謝謝你的評論解決了這個問題,我需要的只是在回調方法中拋出一個錯誤。 – sprocket12

回答

0

而不是返回一個布爾如果它失敗,你可以返回文件路徑,如果它傳遞了一個空字符串。或類似的東西。

+0

是的,我必須先得到filePath,但是... – sprocket12

0

您可以使用匿名方法,以便您的「文件」變量可以被「捕獲」,因此您可以在ValidationEvent回調中使用它。

public static bool ValidateXmlFile1(string filePath, XmlSchemaSet set) 
    { 
     bool bValidated = true; 

     try 
     { 
      XmlDocument tmpDoc = new XmlDocument(); 

      tmpDoc.Load(filePath); 

      tmpDoc.Schemas = set; 

      ValidationEventHandler eventHandler = new ValidationEventHandler(
       (Object sender, ValidationEventArgs e) => 
       { 
        switch (e.Severity) 
        { 
         case XmlSeverityType.Error: 
          { 
           Debug.WriteLine("Error: {0} on file [{1}]", e.Message, filePath); 

          } break; 

         case XmlSeverityType.Warning: 
          { 
           Debug.WriteLine("Error: {0} on file [{1}]", e.Message, filePath); 

          } break; 
        } 

        bValidated = false; 
       } 
      ); 

      tmpDoc.Validate(eventHandler); 
     } 
     catch 
     { 
      bValidated = false; 
     } 

     return bValidated; 
    }