2011-06-15 3 views
28

J'ai essayé de comprendre comment vérifier la syntaxe d'un fichier XML, m'assurer que toutes les étiquettes sont fermées, qu'il n'y a pas de caractères aléatoires, etc ... Tout ce qui m'intéresse c'est de faire Assurez-vous qu'il n'y a pas de code XML défectueux dans le fichier.Validation de la syntaxe XML en Java

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

... mais je me suis aperçu que je ne vouloir 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.

Répondre

40

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é dans le code ci-dessus est comme suit:

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

Cette est venu de this website, qui fournit diverses méthodes pour valider XML avec Java. Notez également que cette méthode charge une arborescence DOM entière en mémoire, voir les commentaires sur les alternatives si vous souhaitez enregistrer sur la RAM.

+0

Est-ce que cela va vérifier la ** syntaxe ** du fichier XML? Je ne veux pas utiliser un schéma XML ici ... – Hristo

+0

Oui, il va vérifier que le document respecte les règles de "bonne forme" énoncées par la spécification XML - http://www.w3.org/TR/xml/# sec-bien formé.Cela signifie que tous les éléments doivent être fermés, imbriqués correctement, etc. En fait, la spécification définit une bonne forme parce que vous ne pouvez pas toujours utiliser une DTD. –

+0

cela analyse et vérifie donc la syntaxe, car sinon il ne pourrait pas l'analyser ... que faites-vous de ce document de toute façon que vous devez faire cela séparément – DaVinci

1

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi/index.html Cela aide-t-il? 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 concernant le type de contenu que vos nœuds et attributs peuvent contenir.

+0

Je ne veux pas utiliser XSD ... Je m'occupe de ce genre de validation ailleurs. Je veux juste vérifier la syntaxe pour le moment. – Hristo

+0

Ça vous dérange de me dire quel est le problème avec l'utilisation de XSD? Voulez-vous pas écrire XSD? Comment savez-vous quelle version de xml votre document doit être conforme? – nsfyn55

+0

Aucun problème ... il y a déjà du code en place pour valider contre un XSD. Mais il ne vérifie pas la syntaxe. – Hristo

3

Ce que vous demandez, c'est comment vérifier qu'un document est un document XML bien formé. Cela se fait facilement en laissant simplement un analyseur XML (essayer de) analyser le contenu en question - s'il y a des problèmes, l'analyseur rapportera une erreur en lançant une exception. Il n'y a vraiment rien de plus à cela; tout ce dont vous avez besoin est de comprendre comment analyser un document XML. A propos de la seule chose à se méfier est que certaines bibliothèques qui prétendent être des analyseurs XML ne sont pas des analyseurs vraiment appropriés, en ce sens qu'ils ne peuvent pas réellement vérifier les choses que XML parser doit faire (selon la spécification XML) - en Java, Javolution est un exemple de quelque chose qui fait peu ou pas de vérification; VTD-XML et XPP3 font des vérifications (mais pas toutes les vérifications requises). Et à l'autre extrémité du spectre, Xerces et Woodstox vérifient tout ce que les spécifications exigent. Xerces est livré avec JDK; et la plupart des frameworks de services Web regroupent Woodstox en plus.

Puisque la réponse acceptée montre déjà comment analyser le contenu dans un document DOM (qui commence par l'analyse), cela peut être suffisant. Le seul inconvénient 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 flux, 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.