Heim  >  Artikel  >  XML-Validierung und Eingabe-Streaming mithilfe von als Datei geladenem XSD

XML-Validierung und Eingabe-Streaming mithilfe von als Datei geladenem XSD

WBOY
WBOYnach vorne
2024-02-09 15:09:091000Durchsuche

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.

Frageninhalt

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

Workaround

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

bereitstellen
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen