2012-04-05 13 views
15

Ho bisogno di implementare un metodo C# che deve convalidare un XML contro un XSD esterno e restituire un risultato booleano che indica se è stato ben formato o meno.Convalida XML contro XSD in un unico metodo

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

So come validate using a callback. Mi piacerebbe sapere se può essere fatto in un unico metodo, senza usare una richiamata. Ho bisogno di questo solo per scopi estetici: ho bisogno di convalidare fino a poche decine di tipi di documenti XML, quindi mi piacerebbe fare qualcosa di semplice come di seguito.

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

risposta

39

Ci sono un paio di opzioni a cui posso pensare a seconda che vogliate o meno utilizzare eccezioni per eventi non eccezionali.

Se si passa un null come il delegato di convalida di richiamata, la maggior parte del built-in metodi di validazione sarà un'eccezione se l'XML è mal formato, in modo da poter semplicemente intercettare l'eccezione e restituire true/false a seconda della situazione .

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

L'altra opzione che viene in mente spinge i limiti della vostra without using a callback criterio. Invece di passare un metodo di callback predefinito, è possibile invece passare un metodo anonimo e utilizzarlo per impostare un valore di ritorno 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

Che cos'è un namespaceName qui? – hajirazin

+1

@hajirazin intendi il tipo, è 'XNamespace'. Non è definito nello snippet perché non era pertinente all'esempio – psubsee2003

+0

anche io avevo lo stesso requisito. lavorando anche per me. Grazie. – hajirazin

Problemi correlati