20 Aug, 2012 von Falco Nogatz 0
XML-Dokumente per XSD 1.1 mit Apache Xerces-J validieren
Seit April diesen Jahres ist XML Schema in der Version 1.1 offizieller Standard des W3C. Nachdem die Version 1.0 noch aus dem Jahre 2004 datiert, wurde die letzten Jahre eifrig diskutiert, ehe der neue Standard nun endlich in Stein gemeißelt wurde.
Dumm nur: Wenngleich seit 2004 über die Änderungen von XSD 1.1 diskutiert wurde, gibt es auch jetzt, nach Veröffentlichung der W3C Recommendation, nur sehr wenige Tools, die die neuen Schema-Elemente wie <assert>
und <alternative>
unterstützen, die XML Schema sehr viel mächtiger werden lassen. Da ich für ein Projekt gerade an einem ziemlich umfangreichen Schema arbeite, wollte ich die Vorteile der neuen Version, insbesondere die beiden eben erwähnten Möglichkeiten der Assertions und Typalternativen, natürlich gleich nutzen. Und benötigte dementsprechend einen XML-Validator, der XSD 1.1 beherrscht.
Nach meiner Recherche gibt es aktuell nur zwei Programme, für die das zutrifft: SAXON (Enterprise Edition) und Apache Xerces. Die aktuellste Version vom <oXygen/> XML Developer kann laut Foren wohl auch mit XSD 1.1 umgehen, ist aber auch nicht ganz billig.
So entschied ich mich für Apache Xerces2 Java, eine Open-Source Implementierung in Java. Zwar setzt sie nur den XSD 1.1 Working Draft von 2009 um, bisher konnte ich aber keinen Verhaltensunterschied zum nun offiziellen Standard feststellen.
Die Installation ist zwar auf deren Seite beschrieben, ich fand sie allerdings nicht sehr intuitiv, daher hier ein paar Bemerkungen: Unter xerces.apache.org kann im unteren Abschnitt “Binary Distributions” die aktuelle Version von Xerces2 Java (XML Schema 1.1) (Beta) heruntergeladen werden. Darin findet sich mit /samples/jaxp/SourceValidator.java
schon ein Kommandozeilenprogramm, über das das fröhliche Validieren beginnen könnte:
java jaxp.SourceValidator -xsd11 -a schema.xsd -i file.xml
Könnte – denn am Anfang wird vermutlich eine Fehlermeldung wie Parse error occurred - No SchemaFactory that implements the schema language specified by: http://www.w3.org/XML/XMLSchema/v1.1 could be loaded
den erfolglosen Versuch quittieren. Klar, irgendwie müssen die Xerces-Daten ja noch ihre Verwendung finden. Die Xerces-FAQ schreiben nur wenig hilfreich:
Use the Endorsed Standards Override Mechanism. Place the xalan.jar, serializer.jar, xercesImpl.jar and xml-apis.jar in the\lib\endorsed directory, whereis where the runtime software is installed.
Okay, was ist also zu tun? – Zu allererst benötigen wir den Java-Pfad. Unter Ubuntu ist das bei mir /usr/lib/jvm/{java-version}/jre
, bei mehreren Java-Installationen findet man mittels java -version
die richtige. Im Unterordner lib
können wir nun den Ordner endorsed
anlegen, wenn er noch nicht existiert. Dort packen wir die Dateien xml-apis.jar, xercesImpl.jar, icu4j.jar, cupv10k-runtime.jar, org.eclipse.wst.xml.xpath2.processor_1.1.0.jar
aus dem Xerces Download hinein. Jetzt fällt auf, wer am Anfang fälschlicherweise doch die “Source Distribution” heruntergeladen hat, da sind die nämlich nicht dabei.
Sind die Dateien im endorsed
Ordner hinterlegt, greift Java direkt darauf zurück. Der obige Aufruf des SourceValidators.java
sollte nun also keinen Fehler mehr werfen und die XML-Datei wie gewünscht nach dem neuen XSD 1.1 Standard validieren.
Übrigens: Die im endorsed
Ordner hinterlegten Jars können natürlich wieder zu Problemen mit anderen Programmen führen. Ich habe mir daher einfach in der ~/.bash_aliases
zwei Aliases angelegt:
alias endorsed-off="sudo mv /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/endorsed/ /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/old_endorsed" alias endorsed-on="sudo mv /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/old_endorsed/ /usr/lib/jvm/java-6-openjdk-amd64/jre/lib/endorsed"