Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

XSLT et les DTD

6 réponses
Avatar
Vincent Hiribarren
Bonjour,

si j'essaie de transformer avec javax.xml.transform.Transformer un
fichier XML, et que celui-ci a la déclaration d'une DTD, le
transformer semble bloquer et cherche à récupérer la DTD
correspondante - et s'il n'y arrive pas le fichier XML ne sera pas
transformé.

Y-a-t'il un moyen quelconque de l'empêcher de se comporter comme ça,
que le parseur XSLT traite immédiatement le XML en faisait fi de la DTD ?

Actuellement, le seul moyen que j'ai trouvé, c'est de parser d'un
autre côté le fichier XML, de supprimer la déclaration de la DTD, puis
de faire passer ce nouveau document XML traité au parseur.

Mais je trouve ça dommage, et étonnant que je ne puisse pas dire au
parseur XSLT de ne pas faire attention aux DTD...

En vous remerciant d'avance pour vos lumières.

6 réponses

Avatar
alexandre cartapanis
Bonjour,

si j'essaie de transformer avec javax.xml.transform.Transformer un
fichier XML, et que celui-ci a la déclaration d'une DTD, le transformer
semble bloquer et cherche à récupérer la DTD correspondante - et s'il
n'y arrive pas le fichier XML ne sera pas transformé.

Y-a-t'il un moyen quelconque de l'empêcher de se comporter comme ça, que
le parseur XSLT traite immédiatement le XML en faisait fi de la DTD ?

Actuellement, le seul moyen que j'ai trouvé, c'est de parser d'un autre
côté le fichier XML, de supprimer la déclaration de la DTD, puis de
faire passer ce nouveau document XML traité au parseur.

Mais je trouve ça dommage, et étonnant que je ne puisse pas dire au
parseur XSLT de ne pas faire attention aux DTD...

En vous remerciant d'avance pour vos lumières.



Je sais que pour un parser, tu peux lui indiquer de ne pas valider un
document (methode setValidating()). Pour les transformer, je ne sais
pas, mais comme je suppose qu'il se sert d'un parser pour analyser le
document avant de le transformer...

La seconde possibilité que je vois, c'est de mettre les PublicId et
SystemID de ta source a "null", comme ca en theorie il ne peux plus
verifier.

Enfin, et suivant l'implementation du transformer, peut etre que tu peux
le specifier en utilisant setParameter() du transformer, mais il faut
trouver le bon parametre :)

Mais bon, je te conseille fortement de te debrouiller pour que la DTD
soit accessible quand meme.

Avatar
Vincent Hiribarren
alexandre cartapanis wrote:

Je sais que pour un parser, tu peux lui indiquer de ne pas valider un
document (methode setValidating()). Pour les transformer, je ne sais
pas, mais comme je suppose qu'il se sert d'un parser pour analyser le
document avant de le transformer...


Oui, mais je ne vois pas comment récupérer ce parseur pour lui faire
changer son comportement.

La seconde possibilité que je vois, c'est de mettre les PublicId et
SystemID de ta source a "null", comme ca en theorie il ne peux plus
verifier.


J'ai vérifié, ils sont bien à "null", mais ça le fait quand même.

Enfin, et suivant l'implementation du transformer, peut etre que tu peux
le specifier en utilisant setParameter() du transformer, mais il faut
trouver le bon parametre :)


Malheureusement je ne vois pas quoi. J'ai même tenté un
transformer.clearParameters() pour tout nettoyer.

Mais bon, je te conseille fortement de te debrouiller pour que la DTD
soit accessible quand meme.


Malheureusement la DTD est :
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

Le xml source est bêtement un fichier "properties" qui est converti en
XML à l'aide de Properties.storeToXml().

Bref, je sais que ce qui est généré est correct, je n'ai pas à
proprement besoin parler de la DTD. Malheureusement le parseur tente
de chercher la DTD sur le Web, chose que je ne veux pas.

Si je suis obligé de l'avoir, comment puis-je faire en sorte que la
DTD soit cherchée localement dans un endroit que je spécifie, au lieu
de la chercher sur le réseau ?

Encore merci d'avance.

Avatar
PASTUREL JL
Regarder là :
http://java.developpez.com/faq/java/?page=generalitesXML
"alexandre cartapanis" a écrit dans le
message de news:4358bda8$0$979$
Bonjour,

si j'essaie de transformer avec javax.xml.transform.Transformer un
fichier XML, et que celui-ci a la déclaration d'une DTD, le transformer
semble bloquer et cherche à récupérer la DTD correspondante - et s'il
n'y arrive pas le fichier XML ne sera pas transformé.

Y-a-t'il un moyen quelconque de l'empêcher de se comporter comme ça, que
le parseur XSLT traite immédiatement le XML en faisait fi de la DTD ?

Actuellement, le seul moyen que j'ai trouvé, c'est de parser d'un autre
côté le fichier XML, de supprimer la déclaration de la DTD, puis de
faire passer ce nouveau document XML traité au parseur.

Mais je trouve ça dommage, et étonnant que je ne puisse pas dire au
parseur XSLT de ne pas faire attention aux DTD...

En vous remerciant d'avance pour vos lumières.



Je sais que pour un parser, tu peux lui indiquer de ne pas valider un
document (methode setValidating()). Pour les transformer, je ne sais
pas, mais comme je suppose qu'il se sert d'un parser pour analyser le
document avant de le transformer...

La seconde possibilité que je vois, c'est de mettre les PublicId et
SystemID de ta source a "null", comme ca en theorie il ne peux plus
verifier.

Enfin, et suivant l'implementation du transformer, peut etre que tu peux
le specifier en utilisant setParameter() du transformer, mais il faut
trouver le bon parametre :)

Mais bon, je te conseille fortement de te debrouiller pour que la DTD
soit accessible quand meme.



Avatar
Vincent Hiribarren
PASTUREL JL wrote:

Regarder là :
http://java.developpez.com/faq/java/?page=generalitesXML


J'avoue ne pas voir où vous voulez en venir.

La seule partie intéressante serait celle sur la création du "tag" sur
le DOCTYPE et la DTD, mais c'est justement car ce "tag" existe déjà et
que je ne veux pas qu'il soit traité que j'ai un problème.

Ou alors il ne me reste plus que la solution consistant à reparser par
moi même le fichier XML pour enlever le tag DOCTYPE, ce qui serait
assez dommage.

Avatar
Anthony Goubard
Oui c'est exact même avec le validating à false le parser cherche encore
à charger le DTD.

La solution:
http://www.javalobby.org/java/forums/t19576.html

Anthony
Vincent Hiribarren wrote:
Bonjour,

si j'essaie de transformer avec javax.xml.transform.Transformer un
fichier XML, et que celui-ci a la déclaration d'une DTD, le transformer
semble bloquer et cherche à récupérer la DTD correspondante - et s'il
n'y arrive pas le fichier XML ne sera pas transformé.

Y-a-t'il un moyen quelconque de l'empêcher de se comporter comme ça, que
le parseur XSLT traite immédiatement le XML en faisait fi de la DTD ?

Actuellement, le seul moyen que j'ai trouvé, c'est de parser d'un autre
côté le fichier XML, de supprimer la déclaration de la DTD, puis de
faire passer ce nouveau document XML traité au parseur.

Mais je trouve ça dommage, et étonnant que je ne puisse pas dire au
parseur XSLT de ne pas faire attention aux DTD...

En vous remerciant d'avance pour vos lumières.


Avatar
Vincent Hiribarren
Anthony Goubard wrote:
Oui c'est exact même avec le validating à false le parser cherche encore
à charger le DTD.

La solution:
http://www.javalobby.org/java/forums/t19576.html


Le problème c'est que ça s'applique à SAX.
Pour faire du XSLT, donc javax.xml.transform.Transformer je ne vois pas.

Tout ce que j'ai c'est un "setURIResolver", donc j'ai fait ça :

transformer.setURIResolver(
new URIResolver (){
public Source resolve(String href, String base) throws
TransformerException {
return (Source)new InputSource(new ByteArrayInputStream(new byte[0]));
}
}
);

Mais ça ne marche pas. D'ailleurs l'aide indique que ça sert à
résoudre les xsl:import ou xsl:include, pas pour la DTD. Et je ne vois
pas comment avoir accès au parseur utilisé pour faire le XSLT.