Je n'ai pas essayé ce que propose B r u n o car c'est arrivé trop tard. Par contre je sais faire ce que tu recherches.
C'est assez facile à faire, mais il y a une contrainte : ton XML doit avoir une déclaration DOCTYPE. Peu importe ce qu'elle contient, mais il doit y en avoir une.
Voici donc ce que j'ai fait -- en espérant que ça corresponde à que tu cherches.
Mon appli reçoit des XML validant différentes DTD. Je sais dire quelle DTD s'applique à tout XML reçu (c'est impératif pour la suite).
Pour parvenir à tes fins, il faut implémenter un EntityResolver dans lequel tu associes dynamiquement la bonne DTD. L'EntityResolver (va voir la javadoc qui va bien) est utilisé par ton parser XML en phase "pré", c'est-à-dire avant même de parser ton XML. Le but étant d'instancier les entités présentes dans ton XML.
Voici mon implémentation d'EntityResolver (que j'ai appelé DTDResolver) :
public class DTDResolver implements EntityResolver {
// the DTD file
private String DTD = null;
// constructor
public DTDResolver(String DTDfile) {
DTD = DTDfile;
}
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
// substitute the DTD
// note it is correct behaviour to return null since this is the default fallback
return new InputSource(new FileInputStream(DTD));
}
}
A utiliser de cette manière (j'utilise JDOM donc tu pourrais avoir à l'adapter) :
// create the XML parser with validation on
SAXBuilder parser = new SAXBuilder(true);
// specify the Entity Resolver
parser.setEntityResolver(new DTDResolver(DTDfile));
[^] # Re: Même problème
Posté par figus . En réponse au message Valider un document XML ne contenant pas de declaration DOCTYPE. Évalué à 1.
C'est assez facile à faire, mais il y a une contrainte : ton XML doit avoir une déclaration DOCTYPE. Peu importe ce qu'elle contient, mais il doit y en avoir une.
Voici donc ce que j'ai fait -- en espérant que ça corresponde à que tu cherches.
Mon appli reçoit des XML validant différentes DTD. Je sais dire quelle DTD s'applique à tout XML reçu (c'est impératif pour la suite).
Pour parvenir à tes fins, il faut implémenter un EntityResolver dans lequel tu associes dynamiquement la bonne DTD. L'EntityResolver (va voir la javadoc qui va bien) est utilisé par ton parser XML en phase "pré", c'est-à-dire avant même de parser ton XML. Le but étant d'instancier les entités présentes dans ton XML.
Voici mon implémentation d'EntityResolver (que j'ai appelé DTDResolver) :
A utiliser de cette manière (j'utilise JDOM donc tu pourrais avoir à l'adapter) :