Frage

In Java kann ich ein XML-Dokument gegen ein XSD-Schema validieren javax.xml.validation.Validator mit oder gegen einen DTD durch einfaches Parsen des Dokuments mit org.xml.sax.XMLReader.

Was ich aber brauchen, ist ein Weg, der programmatisch zu bestimmen, ob das Dokument selbst validiert gegen eine DTD (das heißt, es enthält eine <!DOCTYPE ...>-Anweisung) oder ein XSD. Im Idealfall muss ich dies tun, ohne das gesamte XML-Dokument in den Speicher geladen werden. Kann jemand bitte helfen?

(Alternativ, wenn es eine Single Art und Weise ein XML-Dokument in Java der Validierung, die sowohl für XSDs und DTDs arbeitet - und ermöglicht eine individuelle Ressourcen zu lösen - die noch besser wäre)

Vielen Dank,

A

War es hilfreich?

Lösung

Es gibt keinen 100% narrensicher Prozess zur Bestimmung, wie ein beliebiges XML-Dokument zu validieren.

Zum Beispiel dieser Version 2.4 Web-Anwendung Deployment Descriptor ein W3 Schema das Dokument zu überprüfen:

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

Dies ist jedoch eine gleichwertige Art und Weise das gleiche auszudrücken:

<?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 scheint nicht einen Mechanismus zu haben, dass Angebote alle Hinweise in das Dokument, das Sie es verwenden sollten. Validierungsmechanismen werden von Dokument Verbraucher bestimmt, nicht Produzenten. Wenn mich nicht alles täuscht, dies war einer der Anstöße den Schalter von DTD modernere Validierungsmechanismen fahren.

Meiner Meinung nach ist die beste Wahl ist es, den Mechanismus Detektor auf den Satz von Dokumenttypen zuzuschneiden Sie verarbeiten, Header-Informationen zu lesen und es als angemessen zu interpretieren. Die StAX Parser ist für diese gut -., weil es ein Pull-Mechanismus ist, können Sie nur den Anfang der Datei lesen und dann auf das erste Element beenden Parsen

Link zu mehr gleichen und Beispielcode und so weiter.

Andere Tipps

Sehen Sie die Paketbeschreibung für javax.xml.validation . Es enthält Informationen über und Beispiele für beide XSDs Validierung und DTDs

Könnten Sie verwenden String-Vergleiche?

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

könnten Sie vielleicht einen Code Beispiel schreiben, wie Sie eine XML gegen ein gegebenes dtd validieren. Es scheint für ein Schema einfach zu sein, aber ich habe Schwierigkeiten zu finden, wie es mit einem dtd zu tun.

Vielen Dank,

Denis.

Ok Ich fand es:

    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.");
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top