web-dev-qa-db-fra.com

Validation de la syntaxe XML dans Java

J'ai essayé de comprendre comment vérifier la syntaxe d'un fichier XML, assurez-vous que toutes les balises sont fermées, qu'il n'y a pas de caractères aléatoires, etc ... fichier.

J'ai regardé certains SO messages comme ceux-ci ...

... mais j'ai réalisé que je ne voulais pas valider la structure du fichier XML; Je ne veux pas valider par rapport à un schéma XML (XSD) ... Je veux juste vérifier la syntaxe XML et déterminer si elle est correcte.

34
Hristo

Vous pouvez vérifier si un document XML est bien formé en utilisant le code suivant:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
factory.setNamespaceAware(true);

DocumentBuilder builder = factory.newDocumentBuilder();

builder.setErrorHandler(new SimpleErrorHandler());    
// the "parse" method also validates XML, will throw an exception if misformatted
Document document = builder.parse(new InputSource("document.xml"));

La classe SimpleErrorHandler mentionnée dans le code ci-dessus est la suivante:

public class SimpleErrorHandler implements ErrorHandler {
    public void warning(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void error(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }

    public void fatalError(SAXParseException e) throws SAXException {
        System.out.println(e.getMessage());
    }
}

Cela venait de ce site Web , qui fournit diverses méthodes pour valider XML avec Java. Notez également que cette méthode charge une arborescence DOM entière dans la mémoire, voir les commentaires pour les alternatives si vous souhaitez enregistrer sur la RAM.

47
James Allardice

Ce que vous demandez, c'est comment vérifier qu'un élément de contenu est un document XML bien formé. Cela se fait facilement en laissant simplement un analyseur XML (essayer) analyser le contenu en question - s'il y a des problèmes, l'analyseur signalera une erreur en lançant une exception. Il n'y a vraiment rien de plus à cela; il vous suffit donc de comprendre comment analyser un document XML.

La seule chose à savoir est que certaines bibliothèques qui prétendent être des analyseurs XML ne sont pas vraiment des analyseurs appropriés, en ce sens qu'elles pourraient en fait ne pas vérifier les choses que l'analyseur XML doit faire (conformément aux spécifications XML) - en Java, Javolution est un exemple de quelque chose qui fait peu ou pas de vérification; VTD-XML et XPP3 font une vérification (mais pas toutes les vérifications requises). Et à l'autre extrémité du spectre, Xerces et Woodstox vérifient tout ce que la spécification impose. Xerces est fourni avec JDK; et la plupart des frameworks de services Web incluent également Woodstox.

Étant donné que la réponse acceptée montre déjà comment analyser le contenu dans un document DOM (qui commence par l'analyse), cela pourrait être suffisant. La seule mise en garde est que cela nécessite que vous ayez 3 à 5 fois plus de mémoire disponible que la taille brute du document d'entrée. Pour contourner cette limitation, vous pouvez utiliser un analyseur de streaming, tel que Woodstox (qui implémente l'API Stax standard). Si c'est le cas, vous devez créer un XMLStreamReader et appeler simplement reader.next() tant que reader.hasNext() renvoie true.

5
StaxMan

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html Est-ce que cela aide? Il utilise XSD qui est assez robuste. Non seulement vous pouvez valider la structure des documents, mais vous pouvez également fournir des règles assez complexes sur le type de contenu que vos nœuds et attributs peuvent contenir.

1
nsfyn55