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 :

Création tag XML avec plusieurs namespace URI [DOM]


Sujet :

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

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut Création tag XML avec plusieurs namespace URI
    Bonjour,

    J'ai un file XML de ce format:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <ep:tc xmlns:ep="http://www.test.com" xmlns:xa="http://www.test2.com">
      <ep:List1>TestValue1</ep:List1>
      <xa:List2>TestValue2</xa:List2>
    </ep:tc>
    J'arrive à lire ce fichier sans soucis grâce au parser. Par contre je ne trouve pas comment le créer!

    J'arrive à créer le tag avec un namespace URI seulement grâce au code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
    Document doc = db.newDocument();
    Element root = doc.createElementNS("http://www.test.com", "ep:tc");
    doc.appendChild(root);
    Mais je n'arrive vraiment pas à trouver comment ajouter "xa" dans le tag root...

    J'ai la possibilité d'ajouter l'url directement dans les sous-nodes. Mais je veux l'éviter car j'en ai plusieurs et ça devient un peu le bordel...ne devient plus très propre...

    Quelqu'un a une idée??

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    En DOM de base Java, je ne vois pas comment faire.

    Mais comme d'habitude, en utilisant JDOM à la place, c'est facile, avec la méthode Element.addNamespaceDeclaration()

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Ce matin j'ai essayé encore un peu et j'ai triché avec DOM...

    voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
    Document doc = db.newDocument();
    Element root = doc.createElementNS("http://www.test1.com", "ep:tc");
    root.setAttribute("xmlns:xa", "http://www.test2.com");
    root.setAttribute("version", "123");
    doc.appendChild(root);
    Mais voilà le résultat si j'essaie d'ajouter un autre attribut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ep:tc xmlns:xa="http://www.test2.com" version="123" xmlns:ep="http://www.test1.com">
    ça fonctionne...le parser lis correctement...mais ce n'est pas très joli.

    D'autre part je n'ai jamais utilisé JDOM et avec peut que j'ai pu lire c'est difficilement intégrable avec DOM. (est-ce que c'est vraie?)
    Je ne voudrais pas modifier tout mon projet à cause de ça...il y aurais trop de changements...

    Est-ce que par hasard il y a une solution simple d'utiliser Element.addNamespaceDeclaration() "intégré" avec DOM?

    p.s. je ne peux pas inverser les 2 setAttribute... car ils se trouvent dans 2 fonctions différentes (j'ai collé ici le code pour faire plus simple)

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 563
    Points : 21 627
    Points
    21 627
    Par défaut
    Citation Envoyé par Bobble Voir le message
    Ce matin j'ai essayé encore un peu et j'ai triché avec DOM...

    voilà le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DocumentBuilder db = docBuilderFactory.newDocumentBuilder();
    Document doc = db.newDocument();
    Element root = doc.createElementNS("http://www.test1.com", "ep:tc");
    root.setAttribute("xmlns:xa", "http://www.test2.com");
    root.setAttribute("version", "123");
    doc.appendChild(root);
    Marrant. Merci pour l'info.

    Citation Envoyé par Bobble Voir le message
    Mais voilà le résultat si j'essaie d'ajouter un autre attribut:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ep:tc xmlns:xa="http://www.test2.com" version="123" xmlns:ep="http://www.test1.com">
    ça fonctionne...le parser lis correctement...mais ce n'est pas très joli.
    Ça c'est une question purement cosmétique, c'est du côté du sérializeur DOM -> XML qu'il faut jouer.

    Une chose que tu pourrais faire, c'est, quand tu veux sérializer un doc DOM, tu le transformes en JDOM (c'est assez facile) et tu le sérialises avec XMLOutputter.
    Ça devrait marcher, c'est pas bien contraignant, mais question efficacité c'est pas terrible.

    D'autre part je n'ai jamais utilisé JDOM et avec peut que j'ai pu lire c'est difficilement intégrable avec DOM. (est-ce que c'est vraie?)

    Je ne voudrais pas modifier tout mon projet à cause de ça...il y aurais trop de changements...
    Passer de l'un à l'autre sans arrêt est difficile, oui. Et très inefficace.
    Honnêtement, choisir le DOM de base au départ est une erreur, à moins d'être en environnement où autre chose n'est pas possible. C'est juste bien trop compliqué sans rien de gagné.

    Est-ce que par hasard il y a une solution simple d'utiliser Element.addNamespaceDeclaration() "intégré" avec DOM?
    Moi j'en connaissais pas, tu viens de m'en donner une.
    En théorie tu ne peux pas espérer faire mieux que ça, l'ordre des attributs est une question de cosmétique qui intervient à la sérialisation.

    p.s. je ne peux pas inverser les 2 setAttribute... car ils se trouvent dans 2 fonctions différentes (j'ai collé ici le code pour faire plus simple)
    Si ça ne dépend que de ça, il te suffit d'écrire une méthode statique qui prend en paramètre un Element et un attribut à lui ajouter :

    - Enlever tous les attributs de l'élément et les garder, les déclarations de namespace dans une List, les autres attributs dans une autre List.
    - Remettre d'abord les attributs normaux.
    - Remettre ensuite les déclarations de namespace.

    ... Mais normalement l'ordre sérialisé des attributs n'est pas garanti identique à l'ordre de leur insertion.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Effectivement, je crois que c'est à cause de l'ordre pas garanti de l'insertion des attributs...car si je prend le même code, mais sans l'attribut "version", le "xmlns: xa" se met bien à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <ep:tc xmlns:ep="http://www.test1.com" xmlns:xa="http://www.test2.com">
    C'est seulement au moment de l'ajout de "version" qu'il se "déplace" avant...

    Si côté efficacité ce n'est pas terrible de sérialiser un doc DOM, le transformer en JDOM le sérialiser avec XMLOutputter, je vais laisser comme ça.
    Si, effectivement, c'est uniquement cosmétique.

    Pour des prochains projet je vais me rappeler d'utiliser JDOM et non pas DOM
    Celui là ce n'est pas moi qui l'a commencé et la personne qui est venue avant moi il a du penser de devoir faire uniquement des petites choses avec DOM et il n'a pas pensé à une possible évolution du code...

    Merci beaucoup pour toutes les infos!!!

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 24/02/2012, 18h53
  2. XML mapper:XSD avec plusieurs namespaces
    Par i_de_aguirre dans le forum Outils
    Réponses: 0
    Dernier message: 09/02/2008, 09h44
  3. Création de table avec plusieurs clés primaires
    Par jeanjean0403 dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 31/12/2007, 15h10
  4. Réponses: 4
    Dernier message: 10/10/2007, 11h11
  5. Réponses: 1
    Dernier message: 30/05/2007, 20h12

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