IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Format d'échange (XML, JSON...) Java Discussion :

Sérialiser un Document avec le DOCTYPE.


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Sérialiser un Document avec le DOCTYPE.
    Salut tous,

    Mon problème de base est que je veux transformer un objet Document en un fichier XML (le Document est créé au départ à partir d'un fichier).

    Au départ, j'étais parti sur une transformation XSL qui marchait très bien sauf qu'elle supprime la déclaration du DOCTYPE.
    J'ai trouvé l'alternative de sérialiser mon objet Document qui est alors écrit à l'identique dans le cas ou mon fichier est lié à un fichier DTD.
    Mais dans le cas d'un schéma XSD et d'un DOCTYPE qui référence des entitées, et bien c'est le binz car toutes mes définitions d'entitées sont inclues dans mon fichier, et j'en ai des caisses.

    Exemple de fichier que je n'arrive pas à recopier à l'identique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE description [
    	<!ENTITY % ops.ent SYSTEM "xsd/V32/characters.ent">
    	%ops.ent;
    ]>
    <description>
    .....
    </description>
    Je me retrouve ensuite avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE description [<!ENTITY % ops.ent SYSTEM 'xsd/V32/characters.ent'>
    <!-- =plus sign B: --><!ENTITY plusmn '&#xB1;'>
    <!-- /pm B: =plus-or-minus sign --><!ENTITY lt '<'>
    <!-- =less-than sign R: --><!ENTITY equals '='>
    <!-- =equals sign R: --><!ENTITY gt '>'>
    <!-- =greater-than sign R: --><!ENTITY divide '÷'>
    <!-- /div B: =divide sign --><!ENTITY times '×'>
    <!-- /times B: =multiply sign --><!ENTITY curren '¤'>
    <!-- =general currency sign --><!ENTITY pound '£'>
    <!-- =pound sign --><!ENTITY dollar '$'>
    <!-- =dollar sign --><!ENTITY cent '¢'>
    .......
    .......
    <!-- =cent sign --><!ENTITY yen '¥'>
    <!-- /yen =yen sign --><!ENTITY num '#'>
    ]>
    <description>
    .....
    </description>
    Help SVP, je n'ai bientôt plus d'ongles....

  2. #2
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Re,

    à priori, il semble que ce ne soit pas au moment de l'écriture du fichier mais lors de la construction de l'objet Document que mon problème survient.
    Le code suivant m'affiche la liste de toutes mes entités externes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DocumentType docType = doc.getDoctype();
    		if (docType != null)
    		{
    			System.out.println(docType.getLocalName());
    			NamedNodeMap nodeMap = docType.getEntities();
     
    			for (int i=0; i<nodeMap.getLength(); i++)
    			{
    				System.out.println(nodeMap.item(i).getNodeName());
     
    			}
    		}
    Et je construit mon objet Document de cette façon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class XmlParser {
     
    	private DocumentBuilderFactory factory;
    	private DocumentBuilder builder;
    	private Document doc;
     
    	XmlParser () {
     
    		try {
    			factory = DocumentBuilderFactory.newInstance();
    			factory.setIgnoringComments(true);
    			factory.setValidating(false);
    			builder = factory.newDocumentBuilder();
    			doc = null;
    		}
    		catch (Exception exp) {
     
    		}
    	}
     
    	public Document parse(String filename) {
    		try {
    			doc = builder.parse(filename);
    		}
    		catch (IOException ex) {
    			System.out.println("IOException : error "+ ex);
    		}
    		catch (SAXException ex) {
    			System.out.println("SAXException : error "+ ex);
    		}
    		return doc;
    	}
    }

    :pleure

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Je ne peux pas croire que personne n'ai jamais rencontré de problème

    Alors UP ! 8)

  4. #4
    Membre confirmé

    Inscrit en
    Juillet 2002
    Messages
    116
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 116
    Points : 514
    Points
    514
    Par défaut
    J'aurais peut être regardé du côté de la méthode setExpandEntityReferences() de la classe DocumentBuilderFactory ...
    En mettant la valeur à false ...

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    salut

    -Le problem est dans la construction de ton arbre syntaxique.
    Tu recupere les entites de l'arbre sans ce preoccuper de la forme
    exemple: < -->lessthan
    Les blans

    Je te pose une question si tu avais un fichier xml comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <font>
    <size>25</size>
    <text>Heltivica</text>
    </font>
    Combien font a d'enfants ??????
    Si tu me repond correctement je te corrige ton source.

  6. #6
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Merci Debernad pour ta réponse.

    J'ai déjà regardé cette méthode mais ça n'y change rien...

  7. #7
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Salut Hirouchima,

    Je comprends pas :
    exemple: < -->lessthan
    Les blans
    en ce qui concerne ta question, je serai tenté de dire que la balise FONT a 2 enfants éléments, qui ont chacun 1 enfant texte.
    Mais lorsque l'on parcourt l'arbre Document, on trouve 5 enfants à FONT.

    ?

  8. #8
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Ok, j'ai compris ce que tu veux dire, les sauts de ligne ou les blancs entre les balises sont traités comment des élément textes.

    Mais je ne vois pas le rapport avec le fait que mon fichier d'entités soit intégré dans mon XML ...
    tu peux m'éclairer ?

    Merci

  9. #9
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Hirouchima où es-tu ?


  10. #10
    Membre du Club
    Inscrit en
    Juillet 2005
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 48
    Points : 40
    Points
    40
    Par défaut
    salut
    excuse me
    Voila une source qui t'expliquera comment faire une transformation d'un
    Document---->Fichier.xml
    Utilise cette methode dans touts tes programme de ce genre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     
    JFileChooser chooser = new JFileChooser();
    if(chooser.showSaveDialog(this) != JFileChooser.APPROVE_OPTION)
      	 		return;
     File f = chooser.getSelectedFile();
     
     
    Document doc = panel.buildDocument();
    Transformer t = TransformerFactory.newInstance().newTransformer();
     
    t.setOutputProperty("doctype-system",
      "http://www.w3.org/TR/2000/CR-SVG-2000802/DTD/svg-2000802-dtd");
     
    t.setOutputProperty("doctype-public","-//W3C//DTD SVG 20000802/EN");
     
    t.transform(new DOMSource(doc), new StreamResult(new FileOutputStream(f)));
     
     
     
    /**Remarque la methode buildDocument() contient ton arbre syntaxique
    exmple : Document doc = builder.newDocument();
                 Element ele = doc.createElement("Html");
    ect.....**/
    Bon voila j'espere que j'etait claire.
    Pour ta reponce 10/10 Bravoooooooo.

    Au revoir

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2003
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Oui, mais ça ne résoud pas mon problème.
    Mais je crois que je n'ai pas été assez clair au début...

    En fait je dois lire un fichier XML, faire des modifs dessus et le réécrire à l'identique. Et là ça coince au niveau de l'internal subset du DOCTYPE.

    Un exemple sera plus clair qu'un long discours. Mon fichier XML :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE description [
    	<!ENTITY % ops.ent SYSTEM "characters.ent">
    	%ops.ent;
    ]>
    <description xmlns="http://www.domainname.com/dirname" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.domainname.com/dirname description.xsd">
    <description>
    Donc je parse ce fichier pour obtenir un objet Document. Avec JDom ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Document doc;
    public void parse(String filename) {
     
    		try {
    			SAXBuilder builder = new SAXBuilder();
    			builder.setExpandEntities(true);
    			doc = builder.build(filename);
    		}
    		catch (IOException exp) {
    			System.err.println("Error in parse : " + exp.getMessage());
    		}
    		catch (JDOMException exp) {
    			System.err.println("Error in parse : " + exp.getMessage());
    		}
    	}
    Et quand je serialise mon objet Document, ma balise DOCTYPE devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <!DOCTYPE description>
    Si je change :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    builder.setExpandEntities(false);
    mon DOCTYPE devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <!DOCTYPE description [
      <!ENTITY %ops.ent SYSTEM "xsd/V32/characters.ent">
      <!ENTITY half "½">
      <!--=fraction one-half-->
      <!ENTITY frac12 "½">
      <!--=fraction one-half-->
      <!ENTITY frac14 "¼">
      <!--=fraction one-quarter-->
      <!ENTITY frac34 "¾">
      <!--=fraction three-quarters-->
      <!ENTITY frac18 "⅛">
      ...
      <!ENTITY minusb "##minusb##">
      <!ENTITY osol "##osol##">
    ]>
    Et je me retrouve avec 430 lignes de définitions d'entitées...

    J'espère avoir été plus clair cette fois.

Discussions similaires

  1. Réponses: 3
    Dernier message: 27/02/2006, 14h14
  2. [Système] Ouvrir un document avec un logiciel défini
    Par TheMorpheus dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 25/01/2006, 09h57
  3. [word] Generer un document avec des champs
    Par webbulls dans le forum Bases de données
    Réponses: 3
    Dernier message: 29/04/2004, 10h47
  4. [SAX] ]Validation d'un Document avec une DTD
    Par laguiff dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 18/02/2004, 09h11
  5. Comment réaliser des modèles de documentations avec XML ?
    Par Dams76 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 29/08/2003, 02h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo