Maison  >  Article  >  Validation XML et streaming d'entrée à l'aide de XSD chargé en tant que fichier

Validation XML et streaming d'entrée à l'aide de XSD chargé en tant que fichier

WBOY
WBOYavant
2024-02-09 15:09:091000parcourir

Sous la direction de l'éditeur PHP Strawberry, nous explorerons la méthode de validation XML et de streaming d'entrée à l'aide de XSD chargé sous forme de fichier. Lorsque nous traitons des données XML, la validation est une étape très importante pour garantir l'exactitude et l'exhaustivité des données. En utilisant des fichiers XSD (XML Schema Definition), nous pouvons définir la structure et les contraintes des documents XML. En chargeant un fichier XSD et en l'utilisant pour valider le flux XML entrant, nous pouvons facilement détecter et gérer les données non conformes, augmentant ainsi la fiabilité et la sécurité de notre application. Nous détaillerons ensuite comment utiliser les fichiers XSD pour la validation XML et le traitement du flux d'entrée.

Contenu de la question

Je rencontre un comportement différent lors de la validation XML si le fichier XSD est chargé en tant que fichier ou ressource.

Si je charge le xsd sous forme de fichier, tout va bien et la validation fonctionne bien :

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);

Au lieu de cela, depuis que j'ai décidé d'inclure le fichier xsd dans le fichier jar, je l'ai chargé en tant que ressource, mais le comportement est différent, lorsque je construis le schéma, je reste coincé dans une saxparseexception et l'erreur se plaint d'un problème dans le fichier xsd Le nom se résout en une définition de type. Le fichier XSD est absolument correct

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);

Je ne comprends vraiment pas pourquoi le chargement du fichier XSD en tant que ressource asstream entraîne un comportement différent

J'utilise jaxb pour la validation XML

Solution de contournement

Je suppose que votre xsd fait référence à d'autres xsd et que votre validateur ne sait pas comment résoudre ces références.

Vous devrez peut-être fournir lsresourceresolver à 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);

Vous devez également appeler streamsource 的两个参数构造函数来在 inputsource 上设置 systemid.

String xsdPath = "my/perfect/path/myFile.xsd";
InputStream inputStream = getClass().getClassLoader().getResourceAsStream(xsdPath);
Source schemaSource = new StreamSource(inputStream, xsdPath);

Voir streamsource(inputstream, string)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer