Parser une XML à partir d'une DTD

Parser une XML à partir d'une DTD - Java - Programmation

Marsh Posté le 07-03-2011 à 09:41:07    

Bonjour,
 
Je voudrais savoir s'il existe une property dans l'API SAXPArser permettant de valider à partir d'une DTD.
 
En effet, j'ai réussi à faire une validation à partir d'une xsd:
 

Code :
  1. SAXParserFactory parserFactory = SAXParserFactory.newInstance();
  2. parserFactory.setValidating(true);
  3.     
  4. InputStream inputstream = new FileInputStream(xml);
  5. SAXParser parser = parserFactory.newSAXParser();
  6. parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
  7. parser.setProperty(JAXP_SCHEMA_SOURCE, xsd);
  8. HandlerDefault handlerDefault = new HandlerDefault();
  9. parser.parse(inputstream,handlerDefault);


La partie suivante du code:  

Code :
  1. parser.setProperty(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);
  2. parser.setProperty(JAXP_SCHEMA_SOURCE, xsd);


me permet d'associer la xsd à partir de laquelle je veux faire ma validation XML.
 
Je voudrais donc faire pareil mais pour associer une DTD.  
En effet dans mon fichier xml, il n'y a pas de précisions sur la DTD  
à utiliser pour valider le fichier et donc je souhaite le préciser dans mon code java...
 
Seriez vous comment faire svp ?
 
Merci d'avance pour votre aide.

Reply

Marsh Posté le 07-03-2011 à 09:41:07   

Reply

Marsh Posté le 07-03-2011 à 11:02:22    

:hello:
Tu crées (ça peut être en mémoire) un fichier qui
1) définit et inclus la DTD (le plus souvent comme une entité parametre externe)
2) définit et inclus ton document a valider, (le plus souvent comme une entité externe)
Et c'est ça que tu parses pour validation

Code :
  1. <?xml version="1.0" standalone="no"?>
  2. <!DOCTYPE myroot [
  3.  <!ENTITY % mydtd SYSTEM "http://www.mysite.com/mydoc.dtd"> <!-- ou SYSTEM "./mydoc.dtd" etc -->
  4.  <!ENTITY mydoc SYSTEM "http://www.mysite.com/mydoc.xml"> <!-- ou SYSTEM "./mydoc.xml" etc -->
  5.  %mydtd;  <!-- inclusion par appel comme entité systeme parametre -->
  6. ]>
  7. &mydoc;  <!-- inclusion par appel comme entité systeme normale  -->


La seule chose à laquelle il faut faire attention, c'est que myroot soit le bon nom de la racine du document xml.

 

Si on n'a pas accès au nom de la racine, on peut recourir à le technique suivante:

Code :
  1. <?xml version="1.0" standalone="no"?>
  2. <!DOCTYPE dummyroot [
  3.  <!ELEMENT dummyroot ANY>
  4.  <!ENTITY % mydtd SYSTEM "http://www.mysite.com/mydoc.dtd">
  5.  <!ENTITY mydoc SYSTEM "http://www.mysite.com/mydoc.xml">
  6.  %mydtd;
  7. ]>
  8. <dummyroot>&mydoc;</dummyroot>


Et il faut créér un nom d'élément pseudo racine dont on est sur qu'il n’apparaît pas comme nom d'élément de la dtd.

 

Bon, bien entendu, tout ça suppose que ta dtd n'a pas de déclaration initiale de <!DOCTYPE mais c'est assez habituel de nos jours, sauf à vouloir vivre dangereusement.

 

A+,


Message édité par gilou le 07-03-2011 à 11:11:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 07-03-2011 à 11:18:53    

Bonjour,
 
Merci pour ta réponse.
Si je comprends bien, il s'agit dans ce cas de rajouter dans le fichier XML l'entête précisant la DTD à la main afin que lorsuqe je lance le parsing du fichier il prenne cette dernière.
 
Ne peut on pas le faire via une property du ParserSAX comme pour les xsd sans modifier le fichier source ?

Reply

Marsh Posté le 07-03-2011 à 11:46:03    

Pas de rajouter dans le fichier XML, mais de créer un petit fichier (le cas échéant, dans un petit buffer en mémoire) qui va être lui validé, et dont la validation va impliquer celle du fichier XML initial.

Citation :

Ne peut on pas le faire via une property du ParserSAX comme pour les xsd sans modifier le fichier source ?

Ben non, il suffit de voir les propriétés dans la doc pour voir que c'est pas le cas, sinon, je me serais pas embêté a faire une réponse compliquée.
http://xerces.apache.org/xerces2-j [...] rImpl.html
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

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