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

  FORUM HardWare.fr
  Programmation
  Java

  Parser une XML à partir d'une DTD

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Parser une XML à partir d'une DTD

n°2061558
lezert
Posté le 07-03-2011 à 09:41:07  profilanswer
 

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.

mood
Publicité
Posté le 07-03-2011 à 09:41:07  profilanswer
 

n°2061586
gilou
Modérateur
Modzilla
Posté le 07-03-2011 à 11:02:22  profilanswer
 

: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é!  --
n°2061592
lezert
Posté le 07-03-2011 à 11:18:53  profilanswer
 

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 ?

n°2061597
gilou
Modérateur
Modzilla
Posté le 07-03-2011 à 11:46:03  profilanswer
 

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é!  --

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

  Parser une XML à partir d'une DTD

 

Sujets relatifs
parser xml en php pour importation dans une base de donnéeAfficher la structure fichiers et dossier en XML (php)
remplir une colonne excel à partir d'une ligne donnéeParsing XML - Problème de Recuperation d'attibuts
[C#] Web service et message SOAP XMLNoméro de jours de l'année a partir d'une date
Script import Flux RSS / XMLParser un flux XML en PHP pour récupérer une valeur
Validation XML en Java - Problème de namespace 
Plus de sujets relatifs à : Parser une XML à partir d'une DTD


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