2008-09-02 41 views
28

Estoy tratando de encontrar una manera de validar un archivo XML grande contra un XSD. Vi la pregunta ...best way to validate an XML... pero todas las respuestas apuntaban a usar la biblioteca Xerces para la validación. El único problema es que cuando uso esa biblioteca para validar un archivo de 180 MB, obtengo una OutOfMemoryException.Validar un archivo XML ENORME

¿Existen otras herramientas, bibliotecas, estrategias para validar un archivo XML más grande que el normal?

EDITAR: La solución SAX funcionó para la validación de Java, pero las otras dos sugerencias para la herramienta libxml también fueron muy útiles para la validación fuera de Java.

+1

Para una herramienta fácil de usar de Windows, puede usar [XML ValidatorBuddy] (http://www.xml-tools.com/ValidatorBuddy.htm) que utiliza el analizador Xerces SAX internamente para validar archivos enormes – Clemens

Respuesta

30

En lugar de usar un DOMParser, use un SAXParser. Esto se lee desde una secuencia de entrada o lector para que pueda mantener el XML en el disco en lugar de cargarlo todo en la memoria.

SAXParserFactory factory = SAXParserFactory.newInstance(); 
factory.setValidating(true); 
factory.setNamespaceAware(true); 

SAXParser parser = factory.newSAXParser(); 

XMLReader reader = parser.getXMLReader(); 
reader.setErrorHandler(new SimpleErrorHandler()); 
reader.parse(new InputSource(new FileReader ("document.xml"))); 
8

Uso libxml, que realiza la validación y tiene un modo de transmisión.

+0

parece que esto también funcionará en libxml2, ¿correcto? – oob

+0

@oob Sí, libxml2 funciona perfectamente. Además, si alguien está buscando los binarios de Windows, están aquí: ftp://ftp.zlatkovic.com/libxml/ – sfarbota

2

Personalmente me gusta usar XMLStarlet que tiene una interfaz de línea de comandos y funciona en las transmisiones. Es un conjunto de herramientas creadas en Libxml2.

1

SAX y libXML ayudarán, como ya se mencionó. También podría intentar aumentar el tamaño máximo de almacenamiento dinámico para la JVM utilizando la opción -Xmx. P.ej. para establecer el tamaño de almacenamiento dinámico máximo en 512 MB: java -Xmx512m com.foo.MyClass

Cuestiones relacionadas