Unter der Anleitung des PHP-Editors Strawberry werden wir die Methode der XML-Validierung und des Eingabe-Streamings mithilfe von als Datei geladenem XSD untersuchen. Wenn wir mit XML-Daten arbeiten, ist die Validierung ein sehr wichtiger Schritt, um die Richtigkeit und Vollständigkeit der Daten sicherzustellen. Mithilfe von XSD-Dateien (XML Schema Definition) können wir die Struktur und Einschränkungen von XML-Dokumenten definieren. Durch das Laden einer XSD-Datei und deren Verwendung zur Validierung des eingehenden XML-Streams können wir nicht konforme Daten leicht erkennen und verarbeiten und so die Zuverlässigkeit und Sicherheit unserer Anwendung erhöhen. Als Nächstes erfahren Sie, wie Sie XSD-Dateien für die XML-Validierung und die Verarbeitung von Eingabeströmen verwenden.
Ich erlebe ein unterschiedliches Verhalten bei der XML-Validierung, wenn die XSD als Datei oder Ressource geladen wird.
Wenn ich die XSD als Datei lade, ist alles in Ordnung und die Validierung funktioniert einwandfrei:
schemafactory sf = schemafactory.newinstance(xmlconstants.w3c_xml_schema_ns_uri); schema schema = sf.newschema(new classpathresource("my/perfect/path/myfile.xsd").getfile()); validator validator = schema.newvalidator(); validator.validate(sourcetovalidate);
Da ich mich stattdessen entschieden habe, die XSD-Datei in das JAR aufzunehmen, habe ich sie als Ressource geladen, aber das Verhalten ist anders: Wenn ich das Schema erstelle, bleibe ich in einer saxparseeception stecken und der Fehler meldet ein Problem in Der Name der XSD-Datei wird in eine Typdefinition aufgelöst. Die XSD-Datei ist absolut korrekt
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); InputStream inputStream = getClass().getClassLoader().getResourceAsStream("my/perfect/path/myFile.xsd"); Source schemaSource = new StreamSource(inputStream); Schema schema = sf.newSchema(schemaSource); // here i get the SAXParseException Validator validator = schema.newValidator(); validator.validate(sourceToValidate);
Ich verstehe wirklich nicht, warum das Laden der XSD als Resourceasstream zu einem anderen Verhalten führt
Ich verwende JAXB für die XML-Validierung
Ich vermute, dass Ihr XSD auf andere XSDs verweist und Ihr Validator nicht weiß, wie er diese Referenzen auflösen soll.
Möglicherweise müssen Sie lsresourceresolver für validator
classloader loader = getclass().getclassloader(); lsresourceresolver resolver = new lsresourceresolver() { public lsinput resolveresource(string type, string namespaceuri, string publicid, string systemid, string baseuri) { inputstream stream = loader.getresourceasstream(systemid); if (stream == null) throw new runtimeexception("could not find " + systemid); lsinput input = new dominputimpl(); input.setpublicid(publicid); input.setsystemid(systemid); input.setbaseuri(baseuri); input.setbytestream(stream); return input; } }; validator validator = schema.newvalidator(); validator.setresourceresolver(resolver);
Sie müssen auch anrufen streamsource
的两个参数构造函数来在 inputsource
上设置 systemid
.
String xsdPath = "my/perfect/path/myFile.xsd"; InputStream inputStream = getClass().getClassLoader().getResourceAsStream(xsdPath); Source schemaSource = new StreamSource(inputStream, xsdPath);
Siehe streamsource(inputstream, string)
Das obige ist der detaillierte Inhalt vonXML-Validierung und Eingabe-Streaming mithilfe von als Datei geladenem XSD. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!