Récupérer dynamiquement le schéma associé à un fichier XML - Java - Programmation
Marsh Posté le 07-07-2005 à 18:36:43
donc, ton document spécifie un schema sur une url, et tu voudrais que par magie le parser devine qu'en fait il doit chopper le schema *quelque part* en local ?
Marsh Posté le 07-07-2005 à 18:44:22
the real moins moins a écrit : donc, ton document spécifie un schema sur une url, et tu voudrais que par magie le parser devine qu'en fait il doit chopper le schema *quelque part* en local ? |
bha non, ca s'est fait par son EntityResolver comme il l'a dit.
Ce qu'il veut, c'est que le parser utilise le schema indiqué dans le document plutot qu'un schema spécifié dans les propriétés system de façon à ce que d'autres type de document (avec d'autres schemas) puisse fonctionner avec son programme sans devoir à chaque fois rentrer en dur l'url du schema dans les propriétés system.
Marsh Posté le 07-07-2005 à 18:55:07
http://www-128.ibm.com/developerwo [...] ipvalschm/
Citation : The schema specification correctly recognizes the lack of robustness due to xsi:schemaLocation. According to the specification, xsi:schemaLocation is only a hint to the parser and the parser may use other means to decide which schema to apply. Unfortunately the specification does not say what those other means should be. JAXP 1.2, a maintenance release for JAXP, fills in the blanks by providing a standard mechanism on the Java platform. |
ca craint, visiblement tu ne peux pas demander au parser d'utiliser l'url indiqué dans le xsi:schemaLocation. Ou bien à la rigueur c'est dépendant de l'implémentation du parser. Dans tous les cas, il ne semble pas y avoir de methode standard pour le faire
Marsh Posté le 07-07-2005 à 18:56:56
rien compris.
et la gueule de l'EntityResolver ?
Marsh Posté le 07-07-2005 à 19:00:38
the real moins moins a écrit : rien compris. |
l'entity resolver est là pour éviter que le parser aille lui même chercher les document référencés par un document à l'url indiqué dans le document. Ca permet de filer une référence à un fichier local, ou plus généralement à un InputStream récupéré à coup de getRessourceAsStream() dans le cas d'une url attendue. Moi j'utilise ca pour parser des doc pour lesquels une DTD est spécifiée. plutot qu'une requete http soit faite à chaque parsing de document, je renvois la dtd que j'ai inclue dans le jar
Regarde la javadoc de EntityResolver pour voir comment ca fonctionne. Google maitrise pas mal le sujet aussi
Marsh Posté le 07-07-2005 à 20:03:08
Euh je sais ce qu'est un EntityResolver, j'étais curieux de voir le *sien*
Marsh Posté le 07-07-2005 à 20:56:17
c'est vrai que si l'EntityResolver ne renvoit pas correctement le xsd, ca peut être ca la cause du problème.
Marsh Posté le 08-07-2005 à 09:00:08
Merci pour vos réponses, pour info mon EntityResolver fonctionne correctement puisqu'il récupère mon schéma en local lors de mes tests mais dès que je mets en commentaire la ligne permettant de donner au parser le schéma associé au document XML ça marche plus.
[Pour TR--, mon entity resolver est initialisé à partir d'un fichier externe (XML), ce qui me permet de modifier sa configuration par paramétrage, ça réalise un bête mapping url <-> chemin absolu de fichier local]
Je suis vraiment étonné que mon problème, qui me semble quand même vraiment basique, ne soit pas pris en charge en standard, il doit y avoir une raison bassement technique pouir cela mais je vois pas... D'autant que je passe par JAXP, qui est quand même pas una API exotique (avec Xerces derrière)...
Enfin, grâce à toi benou j'ai ma réponse, merci
Marsh Posté le 08-07-2005 à 09:23:54
je suis pas sûr ...
j'ai un peu googlé, et d'après ce que j'ai cru comprendre, si le schemaSource n'est pas défini dans les propriétés, le parseur cherche lui même le xsd dans le schemaLocation ...
=> d'après ce que j'ai pu lire, ca devrait faire ce que tu veux, mais visiblement dans ton cas ca ne marche pas ...
dans tous les cas, c'est pas bien clair ... tu peux peut être essayer de voir ce que si passe à coup de debugguer, mais ca risque d'être long. Essaye aussi de comprendre d'où vient l'erreur que tu obtiens quand tu vires le schemaSource
Marsh Posté le 08-07-2005 à 09:47:15
Bon et bien, je viens de jeter un oeil à la manière dont Spring avait codé son BeansDtdResolver et la faute venait de mon EntityResolver qui était incomplet (c'est la 1ère fois que j'en code un), j'avais omis d'appeler les méthodes setPublicId(String) et setSystemId(String) sur l'InputSource que je créais, du coup le parser n'était pas capable de récupérer le schéma en local...
Toutes mes confuses mais vous m'avez mis sur la voie.
Marsh Posté le 08-07-2005 à 18:38:39
tiens, je crois que je le fais jamais non plus
mais avec des dtd ca doit pas avoir d'importance ....
Marsh Posté le 07-07-2005 à 12:46:14
Salut,
Je tente de parser (en le validant), le document XML suivant
(Document officiel de sa majesté). Il est validé par un schéma (cf balise <CodingNoticesP6P6B> ).
J'arrive à valider ce document XML par rapport à son schéma mais je suis obligé de faire ce qui suit:
J'associe au parser (non montré ici) un ErrorHandler et un EntityResolver afin que le schéma soit accédé en local.
Mon problème, c'est que je suis obligé de spécifier (dans mon code) le schéma associé au document alors que cette information est dans le document lui-même. Comment faire en sorte que je puisse me passer de cette définition dans mon code, vu que je souhaite que mon programme puisse être "agnostique" par rapport au type de document à traiter en entrée ?
Pour info, si je retire le code associé à "Définition du schéma associé au document", j'obtiens l'erreur:
org.xml.sax.SAXParseException: src-resolve: Cannot resolve the name 'IRstringType' to a(n) type definition component.
J'imagine (au pire) faire un préparsing en SAX pour récupérer le schéma mais ça me semble vraiment de la bidouille et lourd en terme de perfs, j'imagine qu'il doit y avoir une méthode plus propre (une feature, une property à positionner ?).
Merci de vos réponses