Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2537 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Récupérer dynamiquement le schéma associé à un fichier XML

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Récupérer dynamiquement le schéma associé à un fichier XML

n°1143144
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 07-07-2005 à 12:46:14  profilanswer
 

Salut,
 
Je tente de parser (en le validant), le document XML suivant
 

Code :
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!--
  3. Schema Valid Sample document
  4. (c) Crown Copyright 2001
  5.  
  6. Generated by X-Meta Version 1.0 dated 20/11/01
  7.   -->
  8. <CodingNoticesP6P6B xsi:schemaLocation='http://www.govtalk.gov.uk/taxation/CodingNoticesP6P6B http://www.inlandrevenue.gov.uk/sc [...] 02-v1.xsd' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns='http://www.govtalk.gov.uk/taxation/CodingNoticesP6P6B' TaxYearEnd='2002' FormType='P6' IssueDate='2001-09-19'>
  9.   <RecordCount>1</RecordCount>
  10.   <IRoffice>
  11.     <Number>075</Number>
  12.     <Reference>S1294</Reference>
  13.     <Name>Bristol</Name>
  14.     <Address>
  15.       <Line>Turkdean</Line>
  16.       <PostCode>SW1 1AA</PostCode>
  17.       <Country>UK</Country>
  18.     </Address>
  19.     <Telephone Mobile='yes' Type='work' Preferred='yes'>
  20.       <Number>01865 203192</Number>
  21.       <Extension>6969</Extension>
  22.     </Telephone>
  23.   </IRoffice>
  24.   <EmployerDetails>
  25.     <Name>Dance Unlimited Ltd.</Name>
  26.     <AgentDetails>
  27.       <AgentID>ID1234</AgentID>
  28.       <Name>CoolAgents Ltd</Name>
  29.       <Address>
  30.         <Line>Turkdean</Line>
  31.         <PostCode>SW1 1AA</PostCode>
  32.         <Country>UK</Country>
  33.       </Address>
  34.     </AgentDetails>
  35.     <Address>
  36.       <Line>Turkdean</Line>
  37.       <PostCode>SW1 1AA</PostCode>
  38.       <Country>UK</Country>
  39.     </Address>
  40.   </EmployerDetails>
  41.   <Employee>
  42.     <Name>
  43.       <Title>Dr</Title>
  44.       <Forename>James</Forename>
  45.       <Surname>Bacon</Surname>
  46.     </Name>
  47.     <NINO>AB123456A</NINO>
  48.     <WorksNumber>5216311Y</WorksNumber>
  49.     <EffectiveDate>2001-09-19</EffectiveDate>
  50.     <CodingUpdate>
  51.       <TaxCode Week1Month1Indicator='X'>433L</TaxCode>
  52.       <TotalPreviousPay Currency='GBP'>25000.00</TotalPreviousPay>
  53.       <TotalPreviousTax Currency='GBP'>12500.50</TotalPreviousTax>
  54.     </CodingUpdate>
  55.   </Employee>
  56. </CodingNoticesP6P6B>


 
(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:
 

Code :
  1. SAXParserFactory factory = SAXParserFactory.newInstance();
  2.         factory.setValidating(true);
  3.         factory.setNamespaceAware(true);
  4.         SAXParser parser = factory.newSAXParser();
  5.         // Définition du type de syntaxe du schéma
  6.         parser.setProperty(
  7.             "http://java.sun.com/xml/jaxp/properties/schemaLanguage",
  8.             "http://www.w3.org/2001/XMLSchema" );
  9.         // Définition du schéma associé au document  
  10.         parser.setProperty(
  11.            "http://java.sun.com/xml/jaxp/properties/schemaSource",
  12.            "http://www.inlandrevenue.gov.uk/schemas/CodingNoticesP6P6B-2002-v1.xsd" );


 
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:
 

Citation :

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
 
 
 

mood
Publicité
Posté le 07-07-2005 à 12:46:14  profilanswer
 

n°1143505
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 07-07-2005 à 17:50:08  profilanswer
 

:/

n°1143557
the real m​oins moins
Posté le 07-07-2005 à 18:36:43  profilanswer
 

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 ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1143561
benou
Posté le 07-07-2005 à 18:44:22  profilanswer
 

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.


---------------
ma vie, mon oeuvre - HomePlayer
n°1143573
benou
Posté le 07-07-2005 à 18:55:07  profilanswer
 

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.  
[...]
The second property (http://java.sun.com/xml/jaxp/properties/schemaSource) sets the location of the schema


:/  
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 :/


---------------
ma vie, mon oeuvre - HomePlayer
n°1143576
the real m​oins moins
Posté le 07-07-2005 à 18:56:56  profilanswer
 

rien compris.
et la gueule de l'EntityResolver ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1143580
benou
Posté le 07-07-2005 à 19:00:38  profilanswer
 

the real moins moins a écrit :

rien compris.
et la gueule de l'EntityResolver ?


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


---------------
ma vie, mon oeuvre - HomePlayer
n°1143617
the real m​oins moins
Posté le 07-07-2005 à 20:03:08  profilanswer
 

Euh je sais ce qu'est un EntityResolver, j'étais curieux de voir le *sien* [:kiki]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
n°1143654
benou
Posté le 07-07-2005 à 20:56:17  profilanswer
 

c'est vrai que si l'EntityResolver ne renvoit pas correctement le xsd, ca peut être ca la cause du problème.

n°1143928
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 08-07-2005 à 09:00:08  profilanswer
 

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 :jap:

mood
Publicité
Posté le 08-07-2005 à 09:00:08  profilanswer
 

n°1143952
benou
Posté le 08-07-2005 à 09:23:54  profilanswer
 

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

n°1143983
machinbidu​le1974
Do you feel lucky, punk ?
Posté le 08-07-2005 à 09:47:15  profilanswer
 

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.

n°1144638
benou
Posté le 08-07-2005 à 18:38:39  profilanswer
 

tiens, je crois que je le fais jamais non plus  :whistle:  
mais avec des dtd ca doit pas avoir d'importance ....


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Récupérer dynamiquement le schéma associé à un fichier XML

 

Sujets relatifs
recuperer valeur menu deroulant en php mysql[BATCH] HELP !!! Copier fichier sans les 3 1ères lignes dans un autre
[cygwin/c++/xerces]accéder a un fichier XML sur le web?[access] Formulaire pour choisir chemin d'acces d'un fichier
[Log4j] Comment spécifier un fichier de log et un fichier d'erreurRécupérer variable créée dynamiquement
lire un fichier text ou autre avec javascript[DOMXML] Récupérer un id ?
Plus de sujets relatifs à : Récupérer dynamiquement le schéma associé à un fichier XML


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR