Question

En Java, je peux valider un document XML contre un schéma XSD à l'aide de javax.xml.validation.Validator ou contre une DTD en analysant simplement le document à l'aide de org.xml.sax.XMLReader.

Il me faut cependant un moyen de déterminer par programme si le document lui-même est validé par rapport à une DTD (c'est-à-dire qu'il contient une instruction <!DOCTYPE ...>) ou à une XSD. Idéalement, je dois le faire sans charger tout le document XML en mémoire. Quelqu'un peut-il s'il vous plaît aider?

(Sinon, s'il existe un moyen unique de valider un document XML en Java qui fonctionne à la fois pour les fichiers XSD et DTD - et permet une résolution personnalisée des ressources - ce serait encore mieux!)

Merci beaucoup,

A

Était-ce utile?

La solution

Il n'existe pas de processus à 100% infaillible pour déterminer comment valider un document XML arbitraire.

Par exemple, cette descripteur de déploiement d'application Web de la version 2.4 spécifie un Schéma W3 pour valider le document:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

Cependant, c’est une façon tout aussi valable d’exprimer la même chose:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee">

RELAX NG ne semble pas disposer d'un mécanisme offrant des astuces dans le document que vous devriez utiliser. Les mécanismes de validation sont déterminés par les consommateurs de documents et non par les producteurs. Si je ne me trompe pas, c'est l'une des impulsions qui a poussé à passer de la DTD à des mécanismes de validation plus modernes.

À mon avis, le mieux est d’adapter le détecteur de mécanisme à l’ensemble des types de documents que vous traitez, de lire les informations d’en-tête et de les interpréter comme il convient. L’ analyseur StAX est bon pour cela - puisqu'il s'agit d'un mécanisme d'extraction, vous pouvez simplement lire le début du fichier, puis quitter l'analyse sur le premier élément.

Lien vers d'autres codes identiques et identiques et tout le reste.

Autres conseils

Voir la description du package pour javax.xml.validation . Il contient des informations et des exemples sur la validation des fichiers XSD et DTD.

Pourriez-vous simplement utiliser des comparaisons de chaînes?

public enum Type {
    XSD,
    DTD,
    UNKNOWN
};

public Type findType(File f) throws FileNotFoundException, IOException {
    BufferedReader reader = null;
    try {
        reader = new BufferedReader(new FileReader(f));
        String line;
        // may want to cut this loop off after a certain number of lines
        while ((line = reader.readLine()) != null) {
            line = line.toLowerCase();
            if (line.contains("<!doctype"))
                return Type.DTD;
            else if (line.contains("xsi:schemaLocation"))
                return Type.XSD;
        }
    } finally {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException ex) {}
        }
    }
    return Type.UNKNOWN;
}

pourriez-vous peut-être poster un exemple de code montrant comment valider un fichier xml contre un dtd donné. Cela semble facile pour un schéma, mais je peine à trouver comment le faire avec un dtd.

Merci beaucoup,

Denis.

Ok je l'ai trouvé:

    XMLReader reader = XMLReaderFactory.createXMLReader();

    // try to activate validation
    try {
          // Turn on validation
          reader.setFeature("http://xml.org/sax/features/validation", true);
          // Ensure namespace processing is on (the default)
          reader.setFeature("http://xml.org/sax/features/namespaces", true);
    } catch (SAXException e) {
        System.err.println("Cannot activate validation.");
    }

    try {
        reader.parse("testFiasRequest.xml");
    } catch (IOException e) {
        System.err.println("I/O exception reading XML document");
    } catch (SAXException e) {
        System.err.println("XML exception reading document.");
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top