[XML / Java] DTD pas trouve = pas possible de parser?

DTD pas trouve = pas possible de parser? [XML / Java] - Programmation

Marsh Posté le 03-01-2002 à 16:34:50    

Salut,
 
Mon problème est assez simple. J'ai un document XML que je dois valider  
 

Code :
  1. <?xml version="1.0" ?>
  2. <!DOCTYPE webconf-config PUBLIC
  3. "-//Infonet group - FUDNDP//DTD Webconf 2.5.X Configuration file//EN"
  4. "http://www.infonet.fundp.ac.be/soft/webconf/webconf-config-2.5.X.dtd">
  5. <webconf-config>


 
Bon supposons que notre site est down (ca peut arriver). Il se passe alors que j'ai une jolie exception que je peux catcher mais impossible de parser ...
 

SUN a écrit :

 
So now you know that a DTD is a requirement for a valid document. That makes sense. (Note, though, that the lack of a type declaration only generates a warning, as specified in the standard. On the other hand, any attempt to actually parse the document is immediately greeted with an error! Oh well...)




 
http://java.sun.com/xml/jaxp/dist/ [...] 6_val.html
 
Ma question : que faire si le DTD est introuvable? Il doit bien avoir moyen de lancer l'appli non? Au pire on le parse sans le valider mais la déclaration du DTD au début du fichier XML l'empêche ...  :gun:


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 03-01-2002 à 16:34:50   

Reply

Marsh Posté le 03-01-2002 à 18:00:29    

pourquoi tu relances pas simplement le parsing en désactivant la validation ?
 
SAXParserFactory factory = SAXParserFactory.newInstance();
factoryWithValidation.setValidating(true);
 
SAXParser saxParserWithValidation = factory.newSAXParser();
factoryWithValidation.setValidating(false);
SAXParser saxParserWithoutValidation = factory.newSAXParser();
 
...
try {
   saxParserWithValidation.parse(ton fichier);
} catch (TonException e) {
   saxParserWithoutValidation.parse(ton fichier);
}
...

Reply

Marsh Posté le 04-01-2002 à 08:31:12    

benou a écrit a écrit :

pourquoi tu relances pas simplement le parsing en désactivant la validation ?
 
SAXParserFactory factory = SAXParserFactory.newInstance();
factoryWithValidation.setValidating(true);
 
SAXParser saxParserWithValidation = factory.newSAXParser();
factoryWithValidation.setValidating(false);
SAXParser saxParserWithoutValidation = factory.newSAXParser();
 
...
try {
   saxParserWithValidation.parse(ton fichier);
} catch (TonException e) {
   saxParserWithoutValidation.parse(ton fichier);
}
...  




 
Bin tu as lu la citation de chez SUN ?
 

SUN a écrit :

 
So now you know that a DTD is a requirement for a valid document. That makes sense. (Note, though, that the lack of a type declaration only generates a warning, as specified in the standard. On the other hand, any attempt to actually parse the document is immediately greeted with an error! Oh well...)  




 
Cela veut dire que si tu déclares un DTD dans ton fichier XML et qu'il ne peut etre trouvé, l'appli génère un warning mais si tu essaies de le parser tu obtiens une erreur et bye. Mais tu vois, meme si tu désactives la validation, c'est ca qui est dingue !
 
j'ai fait setvalidating(false);
rien à faire, le simple fait d'avoir un external type definition dans mon doc xml m'oblige à avoir la ressource ready. Ce qui est logique, il me semble mais bon de là à refuser un parsing sans validation (il faut pas oublier que tu peux déclarer certaines choses dans le DTD vitale pour le parsing du document).
 
Bref je suis bloqué mais bon tant pis!


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 04-01-2002 à 21:11:04    

ca me parrait bizarre ton histoire...
y a forcément moyen de le désactiver !
désolé, j'ai pas beaucoup d'expérience dans le parsing XML en java ...
 
sinon j'ai bien une solution à la con... mais bon c'est de la bidouille :
tu déclares un proxy http dans ton appli java (System.setProperty()) vers un proxy que tu codes toi même.
 
Pour le proxy tu fais ouvre une socket qui à chaque message entrant renvoie une DTD qui valide ton document quelque soit sa forme.
 
comme ca, quand ton parser voudra aller consulter la dtd distante, il passera par ton proxy qui lui renverra une dTD validante. et le tour est joué.
 
bon, je l'avais dit que c'était de la bidouille :)

Reply

Marsh Posté le 04-01-2002 à 21:18:27    

et puis sur le site c'est pas ca qu'ils disent (que je comprend en tout cas). ils disent que si tu forces la validation (factory.setValidating(true)), et que le document ne référence pas une DTD, la ca fait un warning puis une erreur.
 
toi c'est plutot l'inverse : tu utilises une parser non validant et ca va quand même chercher la dtd si y a un doctype.

Reply

Marsh Posté le 05-01-2002 à 11:12:36    

Si tu déclares un entité exterene (ici le DTD), cela n'a aucune importance que le parser valide ou pas. Le parser n'est pas censé savoir qu'il ne s'agit que du DTD. Tu pourrais très bien déclaré des choses qui sont obligatoires pour parser le doc correctement ...
 
-> Si c'est déclaré, ca doit etre trouvé sinon warning puis erreur.
 
Malheureusement .... :(


---------------
What is popular is not always right, what is right is not always popular :D
Reply

Marsh Posté le 05-01-2002 à 11:30:55    

ha ... bon ben dans ca cas la, a part ma solution bidouille, j'ai rien à proposer ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed