Domanda

In Java, posso convalidare un documento XML su uno schema XSD usando javax.xml.validation.Validator o su un DTD semplicemente analizzando il documento usando org.xml.sax.XMLReader.

Ciò di cui ho bisogno è tuttavia un modo per determinare a livello di programmazione se il documento stesso convalida rispetto a un DTD (ovvero contiene un'istruzione <!DOCTYPE ...>) o un XSD. Idealmente, devo farlo senza caricare l'intero documento XML in memoria. Qualcuno può aiutare per favore?

(In alternativa, se esiste un singolo per convalidare un documento XML in Java che funziona sia per XSD che per DTD - e consente la risoluzione personalizzata delle risorse - sarebbe ancora meglio!)

Mille grazie,

A

È stato utile?

Soluzione

Non esiste un processo infallibile al 100% per determinare come convalidare un documento XML arbitrario.

Ad esempio, questa versione 2.4 descrittore di distribuzione delle applicazioni web specifica un schema W3 per convalidare il documento:

<?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">

Tuttavia, questo è un modo altrettanto valido di esprimere la stessa cosa:

<?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 non sembra avere un meccanismo che offra qualsiasi suggerimenti in il documento che dovresti usare. I meccanismi di convalida sono determinati dai consumatori di documenti, non dai produttori. Se non sbaglio, questo è stato uno degli impulsi che spingono dal passaggio da DTD a meccanismi di validazione più moderni.

A mio avviso, la soluzione migliore è quella di adattare il rivelatore di meccanismi all'insieme dei tipi di documenti che stai elaborando, leggendo le informazioni dell'intestazione e interpretandole come appropriato. Il StAX parser è buono per questo - poiché si tratta di un meccanismo pull, puoi semplicemente leggere l'inizio del file e quindi uscire dall'analisi sul primo elemento.

Link a più dello stesso codice di esempio e quant'altro.

Altri suggerimenti

Vedi la descrizione del pacchetto per javax.xml.validation . Contiene informazioni ed esempi per la convalida di XSD e DTD

Potresti semplicemente usare i confronti di stringhe?

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

potresti forse pubblicare un esempio di codice su come convalidare un xml rispetto a un determinato dtd. Sembra facile per uno schema, ma faccio fatica a trovare il modo di farlo con un dtd.

Grazie mille

Denis.

Ok l'ho trovato:

    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.");
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top