XML-Datei mit Java einlesen und gegen ein Schema validieren

URL dieses Beitrags: http://blog.stefan-macke.com/2008/03/26/xml-datei-mit-java-einlesen-und-gegen-ein-schema-validieren/

Eine XML-Datei mit Java einzulesen und gegen ein XML-Schema zu validieren ist recht einfach, wenn man weiß wie es geht ;-)

Gut, dass es zu diesem Thema einige sehr gute Quellen im Internet gibt (z.B. XML Validation and XPath Evaluation in J2SE 5.0 oder Validation with Java and XML Schema, Part 3). Zuerst habe ich es mit der hier beschriebenen Vorgehensweise probiert: Validating with XML Schema. Kurz gesagt: man holt sich eine DocumentBuilderFactory und konfiguriert sie mittels setValidating(true), um die XML-Datei zu validieren. Dafür muss jedoch in der entsprechenden XML-Datei dann auf das XML-Schema verwiesen werden (mittels schemaLocation), was in meinem Fall zu Problemen beim Auflösen von Pfaden führte (die man aber sicher irgendwie umgehen kann). Darüber hinaus hat die Validierung von Constraints (in meinem Fall unique) nicht korrekt funktioniert, sodass ich den Weg über einen Validator gegangen bin.

Doch zunächst einmal mein Beispiel: Es handelt sich um eine XML-Datei, die (sehr einfach) den Aufbau einer Fertigungsanlage beschreibt (siehe Bild hier: Wegfindung mit dem A*-Algorithmus in Java). Eine ProductionPlant enthält Modules (die Teile der Anlage wie z.B. Förderbänder und Drehteller) und Connections zwischen diesen, die jedoch für mein Beispiel nicht wichtig sind. Jedes Module hat eine (eindeutige → unique) ID.

Der eigentliche Code, der nun die XML-Datei einliest und validiert, ist der folgende:

  1. // create a factory that understands namespaces and validates the XML input
  2. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
  3. factory.setNamespaceAware(true);
  4. // read the XML file
  5. DocumentBuilder builder = factory.newDocumentBuilder();
  6. Document doc = builder.parse(new File("SamplePlant.xml"));
  7. // create a SchemaFactory and a Schema
  8. SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
  9. Source schemaFile = new StreamSource(new File("ProductionPlant.xsd"));
  10. Schema schema = schemaFactory.newSchema(schemaFile);
  11. // create a Validator object and validate the XML file
  12. Validator validator = schema.newValidator();
  13. validator.validate(new DOMSource(doc));
  14. System.out.println("XML file successfully validated.");

Download

In eine Klasse gepackt und um die import-Anweisungen und einen (einfachen) ErrorHandler ergänzt, gibt es das Ganze hier zum Download: PlantBuilder.

Wie folgt kann das kleine Programm gestartet werden:

Kompilierung und Ausführung von PlantBuilder

Kommentare zu diesem Beitrag

  1. Gravatar Daniel
    Am 7. Dezember 2009 um 19:14 Uhr

    Hallo,
    ich habe diesen Code benutzt um eine XML-Datei gegen ein selbstgeschriebenes Schema zu validieren. Nachdem ich zuerst Fehlermeldungen bekam, da das Schema wohl noch nicht so 100%ig korrekt war, hat er mir immer ausgegeben, dass das XML file successfully validated sein soll. Nur, es wird anscheinend jede XML-datei succssfully validated… Also ich konnte auch Fehler einbauen und habe danach auch noch andere XML-files ausprobiert und es kommt immer die Erfolgsmeldung.
    Woran kann das liegen?
    Danke für eine Antwort. Ich bin da so n bisschen an meinen Grenzen.
    Gruß,
    Daniel

  2. Gravatar Stefan
    Am 7. Dezember 2009 um 22:02 Uhr

    @Daniel: Sorry, kann ich dir so nicht sagen! Schickst du mir mal dein Programm und die XML-/XSD-Datei per Mail?

Einen Kommentar schreiben

XHTML: Diese Tags sind erlaubt: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>