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 :

Modifier la valeur d'un noeud d'un arbre XML


Sujet :

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

  1. #1
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut Modifier la valeur d'un noeud d'un arbre XML
    Bonjour à tous et à toutes,

    J'ai créer un parser XML permettant de parcourir les éléments de mon arbre XML dont voici la structure. Il s'agit d'une réponse d'un webService XML via SOAP.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <cdis1:Context>
                   <cdis1:CatalogID>41</cdis1:CatalogID>
                   <cdis1:ConfigurationPolicy/>
                   <cdis1:CustomerID/>
                   <cdis1:CustomerId/>
                   <cdis1:CustomerNumber>0000000C1C25</cdis1:CustomerNumber>
                   <cdis1:CustomerPoolID>20</cdis1:CustomerPoolID>
                   <cdis1:SiteID>41</cdis1:SiteID>
                </cdis1:Context>
    Je souhaiterai à l'aide d'une requête SQL (que j'ai déjà créée) modifier la valeur du noeud <cdis1:CustomerID/>, c'est dire mettre une valeur dans cette balise vide.

    J'avais pensé à la conception UML suivante :
    - Créer une classe Context ayant comme attributs l'ensemble des noeuds fils du noeud Context de l'arbre XML. Cette classe aurait un constructeur vide, elle disposerait de 2 méthodes.
    +loadfromXMLElement(String elt) qui prendrait en paramètre un élément en l'occurrence un attribut de la classe.
    +getXMLElement() -> XMLFormat qui ne prend aucun paramètre mais qui renvoi un fichier en sortie correspondant à la valeur du noeud dans l'arbre XML.

    Dans une autre classe (contenant le main), je crée une méthode foundCustomerID(Context ctx) -> qui renvoi l'arbre XML modifié avec la requête SQL.

    Dites-moi ce que vous en pensez, et comment implémenteriez-vous ce cas de figure?

    Merci d'avance.
    transact.

  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
    Honnêtement je ne comprends rien, et je serais assez surpris d'être le seul.

    - "Ceci est une réponse SOAP, je cherche à y modifier quelque chose"
    => Mais... Pourquoi faire ?

    - "Ce sera en Java, avec une requête SQL (et je l'ai déjà écrite)"
    => Hein ?

    Par ailleurs j'ai aucune idée de ce que les méthodes loadfromXMLElement() et getXMLElement() sont censées faire. (Oui, je sais que tu as essayé de le décrire. Je plains tes profs, mais ils ont l'habitude. Ici, c'est peu probable qu'on l'ait.)
    Alors, la conception UML, hein...

    Citation Envoyé par transact
    et comment implémenteriez-vous ce cas de figure?
    Déjà je modifierais pas une réponse SOAP (ou une réponse de quelque format que ce soit.) Ça sert à rien, si je veux modifier des résultats, je le fais après les avoir extraits de leur format, évidemment.
    Bon, sauf si je suis une sorte de proxy entre le client du webservice et le webservice lui-même, et que mon rôle est de changer ses réponse.
    Dans ce cas :

    - Je charge la réponse dans un Document JDOM.
    - Je modifie ce Document JDOM.
    - J'en fais ce que doit : je le transmets ou l'enregistre de la façon voulue, probablement en passant par un XMLOutputter.

    La conception UML dépend principalement de
    - comment je lis cette réponse SOAP ?
    - où je dois mettre la réponse modifiée.

    En effet, la transformation elle-même, est une méthode, possiblement static, qui prend un Document JDOM en entrée, fournit ce même document JDOM modifié en sortie, et qui se contente, en quatre ou cinq lignes, de faire la modification voulue.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Merci pour toutes ces précisions. Je vous avouerai que je n'ai pas été très clair dans mon explication du problème, et dans la conception UML.
    Je vous tiendrai au courant de la solution que vous me proposez.

  4. #4
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Dans un premier temps, j'ai préféré afficher la réponse du webService XML renvoyé par SOAP.
    J'utilise SAXBuilder pour parcourir le fichier XML renvoyé la console me renvoie le message suivant The prefix "cdis1" for element "cdis1:Context" is not bound. Faut-il déclarer l'espace de nom cdis1? et comment?

    Voici le code que j'utilise
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    package beans;
     
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
     
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import constantes.Pathname;
     
    public class LoadXMLDocumentCDS {
     
    	public static void main(String[] args) {
    		// instanciation d'un objet SAXBuilder
    		SAXBuilder builder = new SAXBuilder();
    		// instanciation du fichier à parser
    		File fichier = new File(Pathname.PATH);
    		try {
    			// déclaration de l'élément document
    			Document document =(Document)builder.build(fichier);
    			// déclaration de l'élément racine
    			Element racine = document.getRootElement();
    			// création d'une liste pour l'arborescence
    			List enfants = racine.getChildren("Body");
    			for(int i=0; i<enfants.size();i++) {
    				Element noeud = (Element) enfants.get(i);
     
    				System.out.println("CatalogID : " + noeud.getChildText("CatalogID"));
    				System.out.println("ConfigurationPolicy : " + noeud.getChildText("ConfigurationPolicy"));
    				System.out.println("CustomerID : " + noeud.getChildText("CustomerID"));
    				System.out.println("CustomerId : " + noeud.getChildText("CustomerId"));
    				System.out.println("CustomerNumber : " + noeud.getChildText("CustomerNumber"));
    				System.out.println("CustomerPoolID : " + noeud.getChildText("CustomerPoolID"));
    				System.out.println("SiteID : " + noeud.getChildText("SiteID"));
    			} // fin for
     
    		} catch (IOException io) {
    			System.out.println(io.getMessage());
    		} catch (JDOMException jdomex) {
    			System.out.println(jdomex.getMessage());
    		}				 		
    	} // fin main()
    }

  5. #5
    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 transact Voir le message
    J'utilise SAXBuilder pour parcourir le fichier XML renvoyé la console me renvoie le message suivant The prefix "cdis1" for element "cdis1:Context" is not bound. Faut-il déclarer l'espace de nom cdis1? et comment?
    Normalement c'est la réponse SOAP (dans son entier) qui devrait l'avoir déclaré quelque part.
    Le bout de code que tu nous montres n'est pas une réponse SOAP. Ça pourrait être un extrait de réponse SOAP, à la rigueur, mais ça ne suffit pas pour être valide.

    Si c'est vraiment ça la réponse que tu reçois, elle n'est pas valide et ça va devenir très compliqué : de nombreux outils XML vont refuser de lire ça.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    Effectivement, la solution devient particulièrement compliqué et je vais me diriger vers des outils ETL (Talend) permettant d'effectuer la modification de la réponse du webService XML.

    Merci encore pour ta réponse thelvin.
    transact.

  7. #7
    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
    - Je ne pense toujours pas que ça ait du sens de modifier une réponse SOAP (ou une réponse en quelque format que ce soit)

    - Je ne vois pas pourquoi Talend ou un autre outil y arriverait mieux que JDOM. Ça reste du XML invalide => même problème.
    Bien sûr, un ETL est en soi plus adapté pour faire ce genre de travail, mais quand un format est invalide, il est invalide pour tout le monde.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre chevronné
    Avatar de Rony Rauzduel
    Homme Profil pro
    En formation Architecte logiciel
    Inscrit en
    Décembre 2008
    Messages
    638
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : En formation Architecte logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2008
    Messages : 638
    Par défaut
    thelvin, en fait je ne vous ai pas fait parvenir l'ensemble du fichier XML mais uniquement une portion (celle que je veux modifier). Le reste des données étant "confidentielles". L'enveloppe SOAP est de la forme

    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                      xmlns:cdis=""
                      xmlns:cdis1=""
                      xmlns:cdis2=""
                      xmlns:cdis3="">
    <!-- supression des espaces de noms car confidentiels -->
    <soapenv:Header/>
       <soapenv:Body>
    <!-- ici tous les éléments confidentiels -->
    ....
    .... etc
     </soapenv:Body>
    </soapenv:Envelope>

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

Discussions similaires

  1. [DOM] Modifier la valeur d'un noeud
    Par ApocKalipsS dans le forum Bibliothèques et frameworks
    Réponses: 10
    Dernier message: 04/03/2011, 17h26
  2. [XSLT 1.0] Modifier la valeur d'un élément d'un fichier XML
    Par gavelin dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 12/01/2011, 10h49
  3. modifier le valeur d'un noeud xml
    Par ragu23 dans le forum C#
    Réponses: 2
    Dernier message: 09/12/2010, 12h32
  4. [DOM] Modifier la valeur d'un noeud dans un fichier XML
    Par rob2-9 dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 25/08/2008, 20h31
  5. Récupérer les valeurs d'un noeud dans un fichier XML
    Par yosthegost dans le forum Delphi
    Réponses: 1
    Dernier message: 30/05/2006, 17h38

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