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 la balise xmlns à l'écriture [DOM]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut Disparition de la balise xmlns à l'écriture
    Bonjour,

    Je rencontre un problème sur l'écriture d'un fichier XML.
    J'utilise dom, et à l'écriture du fichier l'attribut "xmlns" disparait (il est sur la balise racine du document).

    La JVM utilisée est la 1.5.0_14

    voilà le code qui me sert à l'écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DOMSource domSource = new DOMSource(this.domDocument);
    		StringWriter writer = new StringWriter();
    		StreamResult result = new StreamResult(writer);
    		TransformerFactory tf = TransformerFactory.newInstance();
    		Transformer transformer = tf.newTransformer();
    		transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    		transformer.transform(domSource, result);
    		FileWriter fileWriter = new FileWriter(this.fuFile);
    		fileWriter.write(writer.toString());
    		fileWriter.close();
    Quand je regarde dans la variable "this.document" avec le debugger, la racine possède bien cet attribut et sa valeur, j'ai l'impression que c'est vraiment l'écriture (transformer.transform?) qui ne prend pas en compte cet attribut.

    C'est un sujet très urgent et je suis un peu frustré de passer du temps là dessus : (

    quelqu'un sait comment il faut faire pour que cet attribut soit écrit dans le fichier de sortie??
    Merci d'avance !

    Alex

  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
    Probablement une histoire d'appeler DocumentBuilderFactory.setNamespaceAware(true) avant de s'en servir pour créer des Document.

    L'une des nombreuses raisons pour lesquelles le DOM fourni avec Java n'est pas pratique et qu'il vaut mieux se rabattre sur JDOM.

    Ah, oui, une remarque au passage : xmlns n'est pas un attribut. C'est une déclaration de namespace.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Ce sont bien des attributs http://www.w3.org/TR/xml-names/#dt-NSDecl

    +1 pour le Namespace aware.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour ta réponse mais le problème n'est pas résolu !

    Je me suis demandé si le problème ne venait pas du fait que j'ai créé l'attribut sur la racine avec setAttribute au lieu de setAttributeNS. J'ai donc modifié mon code mais sans succès!

    voilà donc le code minimal auquel je suis arrivé :

    création de mon document :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
    fabrique.setNamespaceAware(true);
    DocumentBuilder constructeur = fabrique.newDocumentBuilder();
    this.domDocument = constructeur.newDocument();
    this.domDocument.setStrictErrorChecking(false);
    Element root = this.domDocument.createElement("root");
    root.setAttributeNS("http://monurl.fr/fus", "xmlns", "http://monurl.fr/fus");
    this.domDocument.appendChild(root);
    j'ai du rajouter la ligne "this.domDocument.setStrictErrorChecking(false);" sinon une exception était levée lors du setAttributeNS

    Sauvegarde du document :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DOMSource domSource = new DOMSource(this.domDocument);
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    TransformerFactory tf = TransformerFactory.newInstance();
    Transformer transformer = tf.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.transform(domSource, result);
    FileWriter fileWriter = new FileWriter(this.fuFile);
    fileWriter.write(writer.toString());
    fileWriter.close();
    XML obtenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    <?xml version="1.0" encoding="UTF-8"?>
    <root/>
    Comme la première fois, j'ai arrêté le debugger sur la ligne transformer.transform pour analyser le contenu de mon objet domDocument.
    L'objet root contient bien un objet de type AttrNSImpl qui est représenté par la chaine "xmlns="http://monurl.fr/fus""

    Je continue les recherches, quelqu'un aurait 'il une idée sur le problème??

  5. #5
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Pour la création, ca devrait plutot etre ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DocumentBuilderFactory fabrique = DocumentBuilderFactory.newInstance();
    fabrique.setNamespaceAware(true);
    DocumentBuilder constructeur = fabrique.newDocumentBuilder();
    this.domDocument = constructeur.newDocument();
    this.domDocument.setStrictErrorChecking(false);
    Element root = this.domDocument.createElement("http://monurl.fr/fus","us:root");
    this.domDocument.appendChild(root);

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour ta réponse c'était ce que j'étais en train de tenter (avec la méthode "createElementNS" par contre, "createElement" n'existe pas avec 2 paramètres).

    Le résultat est mieux, car "xmlns" apparait maintenant dans mon root !
    Par contre le souci, c'est que maintenant "xmlns" apparait dans toutes les balises filles de ma racine (xmlns=""), ce que je ne veux pas.

    Je sais que je pinaille un peu mais en fait, je charge un XML en entrée, que je représente en mémoire rien qu'avec des objet à moi, et quand je re-sauvegarde, je voudrais me retrouver exactement avec ce que j'avais en entrée. Et en l’occurrence, dans les fichiers que j'aurai en entrée, "xmlns" sera toujours présent, mais uniquement dans la balise root!

    Connais tu un moyen de paramétrer ça?

  7. #7
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par legentil Voir le message
    Par contre le souci, c'est que maintenant "xmlns" apparait dans toutes les balises filles de ma racine (xmlns=""), ce que je ne veux pas.
    C'est que tes éléments filles n'appartiennent pas au namespace par défaut.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  8. #8
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    Citation Envoyé par legentil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    root.setAttributeNS("http://monurl.fr/fus", "xmlns", "http://monurl.fr/fus");
    this.domDocument.appendChild(root);
    xmlns n'appartient pas au namespace "http://monurl.fr/fus" mais "http://www.w3.org/2000/xmlns/"
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

  9. #9
    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 Nemek Voir le message
    xmlns n'appartient pas au namespace "http://monurl.fr/fus" mais "http://www.w3.org/2000/xmlns/"
    Non mais... On s'en fout, ça n'a rien à voir avec la choucroute, et de tout façon, cette méthode-là ne marchera pas.
    Il est vrai que Namespaces in XML définit les déclarations de namespaces comme des attributs particuliers, mais il est bien le seul. Je conseille de ne pas prendre les définitions isolées.

    Par contre le souci, c'est que maintenant "xmlns" apparait dans toutes les balises filles de ma racine (xmlns=""), ce que je ne veux pas.
    Si tu ne veux pas que ça arrive, tu dois mettre toutes tes balises dans le même namespace que la racine. En les déclarant de la même manière que la racine.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  10. #10
    Rédacteur/Modérateur
    Avatar de Logan Mauzaize
    Homme Profil pro
    Architecte technique
    Inscrit en
    Août 2005
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Transports

    Informations forums :
    Inscription : Août 2005
    Messages : 2 894
    Par défaut
    1. Qu'il s'agisse d'un attribut spécial ou pas, ça reste un attribut par définition. Autant être précis.
    2. Je n'ai jamais eu besoin de rajouter un attribut xmlns mais vue comment fonctionne le DOM (une image du fichier XML). A mon sens il devrait le permettre.
    3. Ca à voir car faisant quelque chose d'erroner le résultat ne peut être qu'erroner. Et derrière une remarque un peu en l'air j'ai remarqué surtout qu'il ne comprenait pas le sens des paramètres et c'était un moyen "obscur" pour qu'il se documente mieux sur leur utilisation.
    Java : Cours et tutoriels - FAQ - Java SE 8 API - Programmation concurrente
    Ceylon : Installation - Concepts de base - Typage - Appels et arguments

    ECM = Exemple(reproduit le problème) Complet (code compilable) Minimal (ne postez pas votre application !)
    Une solution vous convient ? N'oubliez pas le tag
    Signature par pitipoisson

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Balise vide : différentes écritures pour même interprétation ?
    Par txomin.patalagoïty dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 15/05/2013, 21h16
  2. Extraire contenu balise XMLNS
    Par SgtBor dans le forum Format d'échange (XML, JSON...)
    Réponses: 9
    Dernier message: 13/04/2010, 11h05
  3. [JDOM] Ajouter une balise xmlns
    Par damdam44 dans le forum Format d'échange (XML, JSON...)
    Réponses: 29
    Dernier message: 03/06/2008, 09h03
  4. obliger de definir un xmlns vide dans ma balise
    Par snopims_ dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 07/01/2008, 22h47
  5. [MSXML3][VBA] Attribut xmlns de la balise racine
    Par Rank dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 08/12/2005, 18h50

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