Ich generiere einige XML-Dateien, die einer mir übergebenen xsd-Datei entsprechen müssen. Wie kann die Konformität am besten überprüft werden?
quelle
Ich generiere einige XML-Dateien, die einer mir übergebenen xsd-Datei entsprechen müssen. Wie kann die Konformität am besten überprüft werden?
Die Java-Laufzeitbibliothek unterstützt die Validierung. Als ich das letzte Mal nachgesehen habe, war dies der Apache Xerces-Parser unter der Decke. Sie sollten wahrscheinlich einen javax.xml.validation.Validator verwenden .
import javax.xml.XMLConstants;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import java.net.URL;
import org.xml.sax.SAXException;
//import java.io.File; // if you use File
import java.io.IOException;
...
URL schemaFile = new URL("http://host:port/filename.xsd");
// webapp example xsd:
// URL schemaFile = new URL("http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd");
// local file example:
// File schemaFile = new File("/location/to/localfile.xsd"); // etc.
Source xmlFile = new StreamSource(new File("web.xml"));
SchemaFactory schemaFactory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(schemaFile);
Validator validator = schema.newValidator();
validator.validate(xmlFile);
System.out.println(xmlFile.getSystemId() + " is valid");
} catch (SAXException e) {
System.out.println(xmlFile.getSystemId() + " is NOT valid reason:" + e);
} catch (IOException e) {}
Die Schema-Factory-Konstante ist die Zeichenfolge, http://www.w3.org/2001/XMLSchema
die XSDs definiert. Der obige Code validiert einen WAR-Bereitstellungsdeskriptor anhand der URL. http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd
Sie können ihn jedoch genauso einfach anhand einer lokalen Datei validieren.
Sie sollten den DOMParser nicht zum Validieren eines Dokuments verwenden (es sei denn, Sie möchten ohnehin ein Dokumentobjektmodell erstellen). Dadurch werden DOM-Objekte erstellt, während das Dokument analysiert wird - verschwenderisch, wenn Sie sie nicht verwenden.
Hier erfahren Sie, wie Sie dies mit Xerces2 tun . Ein Tutorial dazu hier (Anmeldung erforderlich).
Ursprüngliche Zuschreibung: offensichtlich von hier kopiert :
quelle
Wir erstellen unser Projekt mit ant, damit wir die Task schemavalidate verwenden können, um unsere Konfigurationsdateien zu überprüfen:
Jetzt werden freche Konfigurationsdateien unseren Build nicht bestehen!
http://ant.apache.org/manual/Tasks/schemavalidate.html
quelle
Da dies eine beliebte Frage ist, werde ich kann , dass Java auch darauf hinweist Validate gegen „bezeichnet“ xsd sind, zum Beispiel , wenn die XML - Datei selbst im Header XSD die angibt, mit
xsi:SchemaLocation
oderxsi:noNamespaceSchemaLocation
(oder xsi für bestimmte Namensräume) ab :oder SchemaLocation (immer eine Liste von Namespace-zu-xsd-Zuordnungen)
Die anderen Antworten funktionieren auch hier, da die .xsd-Dateien den in der .xml-Datei deklarierten Namespaces "zugeordnet" sind, weil sie einen Namespace deklarieren und wenn Sie mit dem Namespace in der .xml-Datei übereinstimmen, sind Sie gut. Aber manchmal ist es praktisch, einen benutzerdefinierten Resolver zu haben ...
Aus den Javadocs: "Wenn Sie ein Schema erstellen, ohne eine URL, Datei oder Quelle anzugeben, erstellt die Java-Sprache eine, die im zu überprüfenden Dokument nach dem zu verwendenden Schema sucht. Beispiel:"
und das funktioniert für mehrere Namespaces usw. Das Problem bei diesem Ansatz ist, dass
xmlsns:xsi
es sich wahrscheinlich um einen Netzwerkspeicherort handelt, sodass er standardmäßig bei jeder Validierung ausgeht und das Netzwerk trifft, was nicht immer optimal ist.Hier ist ein Beispiel, das eine XML-Datei anhand von XSDs überprüft, auf die sie verweist (auch wenn sie aus dem Netzwerk abgerufen werden muss):
Sie können vermeiden, referenzierte XSDs aus dem Netzwerk abzurufen, obwohl die XML-Dateien auf URLs verweisen, indem Sie die xsd manuell angeben (siehe einige andere Antworten hier) oder einen Resolver im Stil eines "XML-Katalogs" verwenden . Spring kann anscheinend auch die URL-Anforderungen abfangen , um lokale Dateien für Validierungen bereitzustellen. Oder Sie können Ihre eigenen über setResourceResolver festlegen , z.
Siehe auch hier für ein weiteres Tutorial.
Ich glaube , dass die Standard - DOM - Parsing zu verwenden ist, können Sie etwas ähnliches mit SAX - Parser tun können , das ist die Validierung als auch
saxReader.setEntityResolver(your_resolver_here);
quelle
setResourceResolver
aber darüber hinaus einstellen , vielleicht öffnen Sie eine neue Frage ...Mit Java 7 können Sie der Dokumentation in der Paketbeschreibung folgen .
quelle
parser.parse(new File("instance.xml"))
. Dasvalidator
akzeptiert aSource
, damit Sie :validator.validate(new StreamSource(new File("instance.xml")))
.ErrorHandler
wenn Sie eine Validierung durchführen müssen.Wenn Sie eine Linux-Maschine haben, können Sie das kostenlose Befehlszeilentool SAXCount verwenden. Ich fand das sehr nützlich.
Es wird gegen dtd und xsd validiert. 5s für eine 50MB Datei.
In Debian Squeeze befindet es sich im Paket "libxerces-c-samples".
Die Definition von dtd und xsd muss in der xml sein! Sie können sie nicht separat konfigurieren.
quelle
xmllint --schema phone.xsd phone.xml
(aus einer Antwort von 13ren)Noch eine Antwort: Da Sie gesagt haben, dass Sie die von Ihnen generierten (schreibenden) Dateien validieren müssen, möchten Sie möglicherweise den Inhalt während des Schreibens validieren, anstatt zuerst zu schreiben und dann zur Validierung zurückzulesen. Sie können dies wahrscheinlich mit der JDK-API für die XML-Validierung tun, wenn Sie einen SAX-basierten Writer verwenden: Wenn ja, verknüpfen Sie den Validator einfach, indem Sie 'Validator.validate (Quelle, Ergebnis)' aufrufen, wobei die Quelle von Ihrem Writer stammt und das Ergebnis ist wohin die Ausgabe gehen muss.
Wenn Sie Stax zum Schreiben von Inhalten verwenden (oder eine Bibliothek, die stax verwendet oder verwenden kann), kann Woodstox die Validierung auch direkt unterstützen, wenn Sie XMLStreamWriter verwenden. Hier ist ein Blogeintrag, der zeigt, wie das gemacht wird:
quelle
Wenn Sie XML-Dateien programmgesteuert generieren, sollten Sie sich die XMLBeans- Bibliothek ansehen . Mithilfe eines Befehlszeilentools generiert XMLBeans automatisch eine Reihe von Java-Objekten basierend auf einer XSD und packt sie zusammen. Mit diesen Objekten können Sie dann ein XML-Dokument erstellen, das auf diesem Schema basiert.
Es bietet integrierte Unterstützung für die Schemaüberprüfung und kann Java-Objekte in ein XML-Dokument konvertieren und umgekehrt.
Castor und JAXB sind andere Java-Bibliotheken, die einen ähnlichen Zweck wie XMLBeans erfüllen.
quelle
Mit JAXB können Sie den folgenden Code verwenden:
quelle
Suchen Sie ein Tool oder eine Bibliothek?
In Bezug auf Bibliotheken ist Xerces2, das sowohl C ++ als auch Java- Versionen hat , so ziemlich der De-facto-Standard .
Seien Sie jedoch gewarnt, es ist eine schwere Lösung. Andererseits ist die Validierung von XML anhand von XSD-Dateien ein ziemlich schweres Problem.
Als Tool, das dies für Sie erledigt, scheint XMLFox eine anständige Freeware-Lösung zu sein, aber nachdem ich es nicht persönlich verwendet habe, kann ich nicht sicher sagen.
quelle
Validieren Sie anhand von Online-Schemas
Überprüfen Sie anhand lokaler Schemas
Offline-XML-Validierung mit Java
quelle
Konfigurieren Sie mit Woodstox den StAX-Parser so, dass er anhand Ihres Schemas überprüft und das XML analysiert wird.
Wenn Ausnahmen abgefangen werden, ist das XML ungültig, andernfalls ist es gültig:
Hinweis : Wenn Sie mehrere Dateien validieren müssen, sollten Sie versuchen, Ihre
XMLInputFactory
und wiederzuverwendenXMLValidationSchema
, um die Leistung zu maximieren.quelle
Ich musste ein XML nur einmal gegen XSD validieren, also habe ich XMLFox ausprobiert. Ich fand es sehr verwirrend und seltsam. Die Hilfeanweisungen schienen nicht mit der Benutzeroberfläche übereinzustimmen.
Am Ende habe ich LiquidXML Studio 2008 (v6) verwendet, das viel einfacher zu verwenden und sofort vertrauter war (die Benutzeroberfläche ist Visual Basic 2008 Express sehr ähnlich, das ich häufig verwende). Der Nachteil: Die Validierungsfunktion ist nicht in der kostenlosen Version enthalten, daher musste ich die 30-Tage-Testversion verwenden.
quelle