2009-10-18 24 views
5

Estoy buscando una herramienta que me diga todo de las fallas de validación del esquema XML. Todas las otras herramientas que he visto me dicen la primera pareja, y luego tengo que arreglarlas antes de que me diga los próximos errores. Me doy cuenta de que algunos errores pueden depender de que otros nodos estén en diferentes órdenes, pero cosas como el tipo de datos con formato incorrecto deberían poder informarse incluso si los nodos están en el orden incorrecto.Validación completa del esquema XML

Ya he consultado las otras herramientas que sugieren otras preguntas aquí, y todas se detienen después de la primera falla. Entonces, si una de esas herramientas hará lo que yo quiero, entonces déjenme saber los pasos para lograr eso.

Una biblioteca de programación o técnica que me permita hacer esto en .NET o Delphi funcionaría.

Respuesta

3

lo uso XMLNotepad mucho. (No sé si ya lo has probado).

¡Es libre y hace un buen trabajo al informar muchos errores simultáneamente, siempre que sean independientes y no terminales! Casi lo mismo que los errores del compilador en Delphi: una vez que ha comenzado en una pista falsa, todo lo siguiente a menudo es una tontería.

De todos modos, ha funcionado muy bien para mí para validar contra esquemas bastante intricados como el TVB 3.2 ...

+0

Tienes que instalar el complemento XMLtools, pero parece funcionar muy bien, ¡gracias! http://sourceforge.net/projects/npp-plugins/ –

+0

OxygenXML también lo hace, probablemente incluso mejor. Hice una redacción completa en otra respuesta. –

2

El problema es que un Esquema XML define el idioma para su documento XML. El validador simplemente intenta 'compilar' su documento XML con esa especificación de idioma.

Para la mayoría de los compiladores que tienen idiomas fijos (como Delphi o C#), tardó bastante tiempo en relajarse lo suficiente como para informar más de un error.

Los esquemas XML son más como un lenguaje dinámico, por lo que estimo que los proveedores de herramientas de validación tardarían aún más en relajarse lo suficiente como para informar más de un error o continuar después del primer error.

no estoy seguro de los productos que hacen esto, pero hay algunas patentes presentadas por las cosas que podrían hacerlo: http://www.faqs.org/patents/app/20080228810 y http://www.faqs.org/patents/app/20080229292

Nota éstos se han presentado en el 2008!

--jeroen

1

Creo que el problema es que una vez que un esquema es válido para cualquier razón, cualquier otra cosa que sigue no es fiable por lo que cualquier fallo de validación adicionales podrían ser engañosos. La necesidad de realizar la validación más allá de "es válido este documento" es tal vez una necesidad demasiado especializada como para haber atraído el interés de las compañías de herramientas.

Desde el punto de vista de un validador para la gran mayoría de los usos, se aplicará, no tiene sentido continuar con la validación una vez que se produce un error. El documento no puede volverse más inválido de lo que ya es y no se puede descubrir que es válido una vez que se ha determinado que no es válido.

Quizás sería útil entender por qué desea hacer esto?

p. Ej. Si intenta formatear un documento para que se ajuste a un esquema, existen herramientas que deberían generar una instancia de documento de ejemplo a partir de un esquema dado para que actúe como referencia o ejemplo/plantilla.

2

Este código en C# debería hacer justamente eso: escaneará todo el XML y lo validará contra el XSD provisto, y escupirá todos los errores de validación (¡o errores también en el esquema!) Cuando sucedan. ¡Espero que esto ayude!

La forma de usar sería:

MyXmlValidator (name of XML file) (name of XSD file) 

Eso es todo lo que hay!

Marc


static void Main(string[] args) 
    { 
     ShowTitle(); 

     if(args.Length < 2) 
     { 
      ShowUsage(); 
      return; 
     } 

     string xmlFileName = args[0]; 
     string xsdFileName = args[1]; 

     if(!File.Exists(xmlFileName)) 
     { 
      ShowError(string.Format("XML File '{0}' does not exist)", xmlFileName)); 
      return; 
     } 

     if (!File.Exists(xsdFileName)) 
     { 
      ShowError(string.Format("XSD schema '{0}' does not exist)", xsdFileName)); 
      return; 
     } 

     StreamReader xsdReader = new StreamReader(xsdFileName); 

     XmlSchema Schema = new XmlSchema(); 
     Schema = XmlSchema.Read(xsdReader, new ValidationEventHandler(XSDValidationEventHandler)); 

     XmlReaderSettings ReaderSettings = new XmlReaderSettings();  
     ReaderSettings.ValidationType = ValidationType.Schema;     
     ReaderSettings.Schemas.Add(Schema); 

     ReaderSettings.ValidationEventHandler += new ValidationEventHandler(XMLValidationEventHandler); 

     XmlTextReader xmlReader = new XmlTextReader(xmlFileName); 
     XmlReader objXmlReader = XmlReader.Create(xmlReader, ReaderSettings); 

     while (objXmlReader.Read()) 
     { } 

     Console.WriteLine("Successful validation completed!"); 
    } 

    private static void XSDValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     Console.WriteLine("Error reading XSD: " + e.Message); 
    } 

    private static void XMLValidationEventHandler(object sender, ValidationEventArgs e) 
    { 
     Console.WriteLine("Validation error: " + e.Message); 
    } 

    private static void ShowError(string message) 
    { 
     Console.WriteLine("ERROR: " + message); 
    } 

    private static void ShowUsage() 
    { 
     Console.WriteLine("USAGE: GaraioXmlValidator (name of XML file) (name of XSD file)" + Environment.NewLine); 
    } 

    private static void ShowTitle() 
    { 
     Console.WriteLine("GaraioXmlValidator v1.0 (c) 2008 by Garaio Technology Lab" + Environment.NewLine); 
    } 
+0

He intentado una solución muy similar a la tuya hace un par de meses: incluso esta se detiene mucho antes de lo que le gusta a Jim. –

+0

Me conoces demasiado bien Jeroen. –

1

descubrí que OxygenXML editor hace un muy buen trabajo de esto también. Es un editor comercial, pero la validación se hace con el Xerces engine para hacer la validación (con la opción de usar otros). Intenté Xerces antes, y no pude conseguir que informe después del primer error, pero dicen que fuerzan para seguir informando Hace un trabajo realmente bueno.

XMLSpy oficialmente no admite esto. Basado en lo que vi de los dos editores, me gusta OxygenXML mucho mejor que XMLSpy, no solo para esa característica tampoco (lo cual es muy bueno de la manera en que lo hace).

+0

oXygen es una gran herramienta. No sé cómo hicimos XSD sin eso. Además, genera documentación de esquema de calidad. – Gerard

Cuestiones relacionadas