2012-04-05 53 views
15

我需要實現一個C#方法,該方法需要根據外部XSD驗證XML並返回布爾結果,以指示它是否格式正確。在單一方法中針對XSD驗證XML

public static bool IsValidXml(string xmlFilePath, string xsdFilePath); 

我知道如何validate using a callback。我想知道是否可以用單一方法完成,而不使用回調。我純粹爲了美觀的目的而需要這樣做:我需要驗證多達幾十種類型的XML文檔,所以我想要做出如下簡單的事情。

if(!XmlManager.IsValidXml(
    @"ProjectTypes\ProjectType17.xml", 
    @"Schemas\Project.xsd")) 
{ 
    throw new XmlFormatException(
     string.Format(
      "Xml '{0}' is invalid.", 
      xmlFilePath)); 
} 

回答

39

根據您是否想要爲非例外事件使用例外情況,我可以想到有幾個選項。

如果您傳遞null作爲驗證回調委託,那麼大多數內置的驗證方法將在XML格式不正確時引發異常,因此您可以簡單地捕獲異常並根據情況返回true/false

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName) 
{ 
    var xdoc = XDocument.Load(xmlFilePath); 
    var schemas = new XmlSchemaSet(); 
    schemas.Add(namespaceName, xsdFilePath); 

    try 
    { 
     xdoc.Validate(schemas, null); 
    } 
    catch (XmlSchemaValidationException) 
    { 
     return false; 
    } 

    return true; 
} 

想到的另一種選擇推動了您的without using a callback標準的限制。除了傳遞預定義的回調方法外,您還可以傳遞匿名方法並使用它設置返回值true/false

public static bool IsValidXml(string xmlFilePath, string xsdFilePath, XNamespace namespaceName) 
{ 
    var xdoc = XDocument.Load(xmlFilePath); 
    var schemas = new XmlSchemaSet(); 
    schemas.Add(namespaceName, xsdFilePath); 

    Boolean result = true; 
    xdoc.Validate(schemas, (sender, e) => 
     { 
      result = false; 
     }); 

    return result; 
} 
+2

什麼是命名空間名稱? – hajirazin 2014-02-19 10:08:48

+1

@hajirazin你的意思是類型,它是'XNamespace'。它沒有在片段中定義,因爲它與示例 – psubsee2003 2014-02-19 10:11:28

+0

無關,即使我有相同的要求。爲我工作。謝謝。 – hajirazin 2014-02-19 10:20:39