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 :

Disparition de l'attribut standalone ainsi que la déclaration du DTD après lecture-écriture d'un document XML


Sujet :

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

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut Disparition de l'attribut standalone ainsi que la déclaration du DTD après lecture-écriture d'un document XML
    Bonjour,

    Je voudrais lire un document xml contenant l'attribut standalone ("yes" ou "no") ainsi qu'une déclaration dtd qui pointe vers un document local, effectuer des traitement sur le document xml (org.w3c.dom.Document) et ensuite réécrire le document sans perdre ces informations citées ci-dessus. Mais tous les utilitaires que j'ai utilisés (pour lire et écrire ce document) font disparaître certaines informations (soit l'attribut standalone, soit la déclaration du dtd soit les deux à la fois) sans que j'aie changé aucune propriété par défaut du parser ni du writer.

    Est ce que quelqu'un connait un moyen de lire et écrire ce document xml en gardant toutes les informations citées ainsi que l'indentation originale?

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    # Pour l'indentation, ça dépend laquelle.

    Si on parle de celle-là :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <root>
      <a>
        <b/>
      </a>
      <a/>
      <a/>
    </root>

    La plupart des systèmes la préservent sans problème. Car cela fait partie des données XML.

    Si on parle de celle-ci :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <a
      attr1="youpi"
      attr2=
        "yahoo"
      />

    Je n'en connais aucun qui le fasse. Ça ne fait pas partie des données XML.

    # Pour la déclaration de DTD, JDOM la préserve sans problème.

    # Pour la déclaration XML avec ou sans standalone, ça ne fait pas partie des données XML.

    Je ne connais rien qui sache le faire, mais j'en ai déjà eu besoin. Combiné à JDOM, il a fallu que je reparse moi-même tout ce qu'il y avait avant le doctype, et que je retienne les données, puis que je modifie le sérialiseur pour le forcer à retranscrire la même déclaration.
    C'est plus de boulot qu'on le voudrait, mais en même temps, c'est pas non plus la mer à boire, pour un programmeur.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Merci pour votre réponse thelvin,

    Concernant l'indentation c'est plus pour garder l'indentation d'origine que ce soit selon le premier exemple que vous avez cité ou le 2ème. Mais bon, s'il n'y a aucun parser qui le fait je ne vais pas passer du temps là dessus et ce sera à l'utilisateur d'indenter son fichier comme il faut s'il veut la garder après le traitement.

    Concernant l'attribut standalone et la déclaration du doctype, je suis déjà parvenu à garder l'un ou l'autre mais pas les deux à la fois en utilisant d'autres parseurs.

    Pourriez vous me dire si vous avez réussi à retranscrire toutes ces informations à la fois (c'est à dire attribut standalone + déclaration doctype) et comment si possible?

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par uaibys Voir le message
    Pourriez vous me dire si vous avez réussi à retranscrire toutes ces informations à la fois (c'est à dire attribut standalone + déclaration doctype) et comment si possible?
    Oui. JDOM ne pose aucun problème dans la gestion du doctype, il ne restait donc que la déclaration XML.

    Pour ça, il a fallu que je fasse un traitement supplémentaire à la lecture du fichier XML : je devais repérer et parser la déclaration XML (en fait, juste trouver où elle s'arrête... Pas besoin de la comprendre complètement puisque le but était de la réécrire telle quelle ensuite.)
    Ensuite, à l'écriture du document modifié, j'ai fait une classe qui étend XMLOutputter de JDOM. Cette classe redéfinit la manière dont XMLOutputter écrit la déclaration XML. Dans mon cas, j'ai fait en sorte de passer en paramètre la déclaration XML du fichier lu, et que la déclaration écrite soit exactement identique.

    Bien sûr, une solution plus pragmatique serait de ne pas avoir toutes ces contraintes.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 17
    Par défaut
    Merci pour votre réponse!

    De ma part je n'avais pas la librairie JDOM dans le projet sur lequel je travaillais donc j'ai préféré faire avec ce que j'avais.

    Il y a un moyen plus simple de faire ça, mais pour l'instant j'ai un problème avec la conservation de l'indentation. Cette solution permet de conserver à la fois l'attribut standalone et la déclaration doctype:

    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
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
     
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
     
    Document plainDoc = docBuilder.parse(new FileInputStream("test/resources/data/xml/invoice_with_dtd.xml"));
     
    Transformer transformer = TransformerFactory.newInstance().newTransformer();
     
    String standalone = null;
    if (plainDoc.getXmlStandalone()) {
    	standalone = "yes";
    } else {
    	standalone = "no";
    }
     
    transformer.setOutputProperty(OutputKeys.STANDALONE, standalone);
    transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, plainDoc.getDoctype().getSystemId());
     
    StreamResult result = new StreamResult(new FileOutputStream("build/serializedUsingTransformer.xml"));
     
    DOMSource source = new DOMSource(plainDoc);
    transformer.transform(source, result);

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Pour l'indentation il n'y a rien à faire. Il vaut mieux cesser de penser XML et juste modifier la partie du fichier qu'on veut, sans toucher au reste. C'est pas très sûr, mais la seule dernière solution, c'est d'écrire son propre parseur XML qui conserve l'indentation.

    Je ne savais pas, pour écrire le standalone et le doctype avec le DOM Java, merci pour l'info. C'est vrai qu'il permet de conserver la déclaration XML, ce que JDOM ne permet pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/01/2013, 15h47
  2. Réponses: 1
    Dernier message: 04/04/2010, 00h15
  3. Réponses: 2
    Dernier message: 30/06/2006, 15h12
  4. Réponses: 4
    Dernier message: 23/04/2006, 10h36
  5. Rafraichissement de la fiche ainsi que de tous les objets
    Par portu dans le forum Composants VCL
    Réponses: 7
    Dernier message: 06/01/2004, 00h25

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