2008-09-02 15 views
28

J'essaie de trouver un moyen de valider un fichier XML volumineux par rapport à un fichier XSD. J'ai vu la question ...best way to validate an XML... mais les réponses indiquaient toutes l'utilisation de la bibliothèque Xerces pour la validation. Le seul problème est que lorsque j'utilise cette bibliothèque pour valider un fichier de 180 Mo, j'obtiens une exception OutOfMemoryException.Validation d'un énorme fichier XML

Existe-t-il d'autres outils, bibliothèques, stratégies pour valider un fichier XML plus grand que la normale?

EDIT: La solution SAX a fonctionné pour la validation Java, mais les deux autres suggestions de l'outil libxml ont été très utiles pour la validation en dehors de Java.

+1

Pour un outil Windows facile à utiliser, vous pouvez utiliser [XML ValidatorBuddy] (http://www.xml-tools.com/ValidatorBuddy.htm) qui utilise l'analyseur Xerces SAX en interne pour valider des fichiers volumineux. – Clemens

Répondre

30

Au lieu d'utiliser un DOMParser, utilisez un SAXParser. Cela se lit à partir d'un flux d'entrée ou d'un lecteur afin que vous puissiez conserver le XML sur le disque au lieu de le charger dans la mémoire.

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

utilisation libxml, qui effectue la validation et a un mode de transmission en continu.

+0

ressemble à ceci fonctionnera aussi sous libxml2, correct? – oob

+0

@oob Oui, libxml2 fonctionne parfaitement. Aussi, si quelqu'un cherche les binaires Windows, ils sont ici: ftp://ftp.zlatkovic.com/libxml/ – sfarbota

2

Personnellement, j'aime utiliser XMLStarlet qui a une interface de ligne de commande, et fonctionne sur les flux. C'est un ensemble d'outils construits sur Libxml2.

1

SAX et libXML vous aideront, comme déjà mentionné. Vous pouvez également essayer d'augmenter la taille maximale du tas pour la machine virtuelle Java à l'aide de l'option -Xmx. Par exemple. Pour définir la taille maximale du segment de mémoire à 512 Mo: java -Xmx512m com.foo.MyClass