2012-04-05 16 views
15

Necesito implementar un método C# que necesite validar un XML contra un XSD externo y devolver un resultado booleano que indique si estaba bien formado o no.Validar XML contra XSD en un único método

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

sé cómo validate using a callback. Me gustaría saber si se puede hacer en un único método, sin utilizar una devolución de llamada. Necesito esto solo con fines cosméticos: necesito validar hasta unas pocas docenas de tipos de documentos XML, por lo que me gustaría hacer es algo tan simple como la siguiente.

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

Respuesta

39

Hay un par de opciones que puedo pensar dependiendo de si desea usar excepciones para eventos no excepcionales.

Si pasa un null como el delegado de validación de devolución de llamada, la mayoría de los incorporados en los métodos de validación será una excepción si el XML está mal formada, por lo que simplemente puede detectar la excepción y volver true/false dependiendo de la situación .

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

La otra opción que viene a la mente empuja los límites de su criterio without using a callback. En lugar de pasar un método de devolución de llamada predefinido, en su lugar podría pasar un método anónimo y usarlo para establecer un valor de retorno 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

¿Qué es un namespaceName aquí? – hajirazin

+1

@hajirazin te refieres al tipo, es 'XNamespace'. No está definido en el fragmento porque no era relevante para el ejemplo – psubsee2003

+0

, incluso yo tenía el mismo requisito. trabajando para mí también. Gracias. – hajirazin

Cuestiones relacionadas