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 :

XML signature, DOM et noeuds null


Sujet :

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

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut XML signature, DOM et noeuds null
    Bonjour,
    Je ne savais pas trop où poster alors comme je suis débutante en java, j'ai supposé que ce post avait sa place ici.
    Je vous explique mon problème : je suis en stage où je dois travailler à faire une signature xml en n'ayant jamais fait de Java avant... Pas évident
    J'ai lu quelques tuto de base de Java mais pas évident de cibler ce que je dois apprendre tellement Java est vaste !
    Donc me voilà rendu à essayer de faire du bidouillage pour comprendre le code qu'on me donne et savoir pourquoi ça marche pas ><
    Bref, voici ce que j'ai fait :
    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
    		String mandate="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
    			+"<document xmlns=\"urn:iso:std:iso:20022:tech:xsd:pain.009.001.01\">\n"
    			+"<MndtInitnReq> \n"
    			+"<Mndt>\n"
    			+"<MndtReqId>00081902E92D2109</MndtReqId>\n"
    			+"<Cdtr>\n"
    			+"<Nm>AtomShop TEST BRED 1</Nm>\n"
    			+"<PstlAdr>\n"
    			+"<TwnNm>41000 BLOIS</TwnNm>\n"
    			+"      </PstlAdr>\n"
    			+"      <Id>\n"
    			+"          <OrgId>\n"
    			+"             <BICOrBEI>55209179500781</BICOrBEI>\n"
    			+"         </OrgId>\n"
    			+"     </Id>\n"
    			+"  </Cdtr>\n"
    			+" <Dbtr>\n"
    			+"     <Nm>Saita Chana</Nm>\n"
    			+" </Dbtr>\n"
    			+" <DbtrAcct>\n"
    			+"     <Id>\n"
    			+"         <IBAN>FR7614505000021234567890132</IBAN>\n"
    			+"     </Id>\n"
    			+" </DbtrAcct>\n"
    			+" <DbtrAgt>\n"
    			+"     <FinInstnId>\n"
    			+"          <BIC>CEPAFRPP450</BIC>\n"
    			+"      </FinInstnId>\n"
    			+"  </DbtrAgt>\n"
    			+"</Mndt>\n"
    			+" </MndtInitnReq>\n"
    			+"</document>\n";
    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
    	private static void test_create_signature_enveloping2
    	(DigestMethod dm, SignatureMethod sm, KeyInfo ki, Key signingKey,
    			KeySelector ks, boolean b64,String mandate) throws Exception {
     
     
    		// create reference
    		Reference ref;
    		if (b64) {
    			ref = fac.newReference("#object", dm, Collections.singletonList
    					(fac.newTransform(Transform.BASE64,
    							(TransformParameterSpec) null)), null, null);
    		} else {
    			ref = fac.newReference("#object", dm);
    		}
     
    		// create SignedInfo
    		SignedInfo si = fac.newSignedInfo(withoutComments, sm,
    				Collections.singletonList(ref));
    		Document doc = db.parse(new ByteArrayInputStream(mandate.getBytes()));
     
    		System.out.println("Début du test1");
    		Element racine = doc.getDocumentElement();
    		NodeList liste = racine.getElementsByTagName("*");
     
    		for(int i=0; i<liste.getLength(); i++){
    			Element e = (Element)liste.item(i);
    			System.out.println(e.toString());
    		}
    		System.out.println("Début du test2");
    		DOMSource domSource = new DOMSource(doc);
    		StringWriter writer = new StringWriter();
    		StreamResult result = new StreamResult(writer);
    		TransformerFactory tf = TransformerFactory.newInstance();
    		Transformer transformer = tf.newTransformer();
    		transformer.transform(domSource, result);
    		String stringResult = writer.toString(); 
    		System.out.println(stringResult);
    Et voici ce que ça me donne en console :
    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
    47
    48
    49
    50
    51
    Début du test1
    [MndtInitnReq: null]
    [Mndt: null]
    [MndtReqId: null]
    [Cdtr: null]
    [Nm: null]
    [PstlAdr: null]
    [TwnNm: null]
    [Id: null]
    [OrgId: null]
    [BICOrBEI: null]
    [Dbtr: null]
    [Nm: null]
    [DbtrAcct: null]
    [Id: null]
    [IBAN: null]
    [DbtrAgt: null]
    [FinInstnId: null]
    [BIC: null]
    Début du test2
    <?xml version="1.0" encoding="UTF-8"?><document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.009.001.01">
    <MndtInitnReq> 
    <Mndt>
    <MndtReqId>00081902E92D2109</MndtReqId>
    <Cdtr>
    <Nm>AtomShop TEST BRED 1</Nm>
    <PstlAdr>
    <TwnNm>41000 BLOIS</TwnNm>
          </PstlAdr>
          <Id>
              <OrgId>
                 <BICOrBEI>55209179500781</BICOrBEI>
             </OrgId>
         </Id>
      </Cdtr>
     <Dbtr>
         <Nm>Saita Chana</Nm>
     </Dbtr>
     <DbtrAcct>
         <Id>
             <IBAN>FR7614505000021234567890132</IBAN>
         </Id>
     </DbtrAcct>
     <DbtrAgt>
         <FinInstnId>
              <BIC>CEPAFRPP450</BIC>
          </FinInstnId>
      </DbtrAgt>
    </Mndt>
     </MndtInitnReq>
    </document>
    Ma première question étant : Ce qui s'affiche au début correspond bien aux noeuds de mon document ?
    Deuxième question : pourquoi sont-ils marqués null alors qu'ils sont renseignés dans le XML ?


    **************************************
    Deuxième partie de mon problème :
    Voici un code que l'on m'a donné pour la suite de ma signature :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    		XMLObject obj = fac.newXMLObject(Collections.singletonList
    				(new DOMStructure(doc.appendChild(doc.getDocumentElement()))), // createTextNode(text))),
    				"object", null, null);
     
    		// create XMLSignature
    		XMLSignature sig = fac.newXMLSignature
    		(si, ki, Collections.singletonList(obj), null, null);
    Vous l'aurez bien compris, cela ne marche pas..
    J'ai bien compris que la XML signature attend un XML Object en premier argument, mais j'ai pas trop compris ce que j'ai mis dans obj et pourquoi cela ne lui convient pas..

    J'espère avoir été claire, si ce n'est pas le cas, n'hésitez pas à me demander des précisions.
    Merci pour votre aide par avance,
    Saita

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Bon, je me répond en partie toute seule (comme quoi, j'avais pas encore assez cherché !)
    Bref, un nœud élément n'a pas de valeur, c'est pour ça qu'appeler getNodeValue() dessus renvoie null.
    Par contre, appeler getNodeValue() sur un nœud texte renvoie le contenu de ce nœud texte.
    Citation de Thelvin

    J'ai lu cette documentation assez bien faite sur DOM : http://jmdoudoux.developpez.com/cour...a/chap-dom.php Mais j'avoue que l'arbre dessiné en début de chapitre me laisse perplexe..
    Pourriez-vous me donnez une idée en reprenant mon xml de la structure pour DOM ?
    Edit :je suis vraiment perplexe..
    J'ai testé ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(e.getNodeName()+" : "+e.getChildNodes()+" : "+e.getFirstChild().getNodeName()+" : "+e.getFirstChild().getNodeValue());
    Et voici le début de la sortir console :
    MndtInitnReq : [MndtInitnReq: null] : #text :

    Mndt : [Mndt: null] : #text :

    MndtReqId : [MndtReqId: null] : #text : 00081902E92D2109
    Cdtr : [Cdtr: null] : #text :

    Nm : [Nm: null] : #text : AtomShop TEST BRED 1
    PstlAdr : [PstlAdr: null] : #text :

    TwnNm : [TwnNm: null] : #text : 41000 BLOIS
    Comment peut-il me répondre null pour la liste des noeuds fils, et en même temps me donner un résultat pour le e.getFirstChild().getNodeName() ?
    Fin Edit

    Concernant la deuxième partie de mon code, j'ai mis ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                Element racine = doc.getDocumentElement();
                XMLObject obj = fac.newXMLObject(Collections.singletonList
                            (new DOMStructure(racine)), // createTextNode(text))),
                            "object", null, null);
     
                // create XMLSignature
                XMLSignature sig = fac.newXMLSignature
                (si, ki, Collections.singletonList(obj), null, null);
    Et ça à l'air de marcher.. Mais bon, j'avoue j'y suis allée un peu au pif donc si quelqu'un a des précisions à apporter je veux bien ^^
    Merci

  3. #3
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Salut,
    je crois qu'une bonne identation du XML te fera sans doute voir les choses plus clairement,
    Code xml : 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
     
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.009.001.01">
      <MndtInitnReq>
        <Mndt>
          <MndtReqId>00081902E92D2109</MndtReqId>
          <Cdtr>
            <Nm>AtomShop TEST BRED 1</Nm>
            <PstlAdr>
              <TwnNm>41000 BLOIS</TwnNm>
            </PstlAdr>
            <Id>
              <OrgId>
                <BICOrBEI>55209179500781</BICOrBEI>
              </OrgId>
            </Id>
          </Cdtr>
          <Dbtr>
            <Nm>Saita Chana</Nm>
          </Dbtr>
          <DbtrAcct>
            <Id>
              <IBAN>FR7614505000021234567890132</IBAN>
            </Id>
          </DbtrAcct>
          <DbtrAgt>
            <FinInstnId>
              <BIC>CEPAFRPP450</BIC>
            </FinInstnId>
          </DbtrAgt>
        </Mndt>
      </MndtInitnReq>
    </document>

    Voici un morceau de l'arbre DOM
    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
     
                  +--------------------+
                  +     Document       +
                  +--------------------+
                           +
                    +---------------+
                    +  MndtInitnReq +
                    +------+--------+
                           +
                    +---------------+
                    +     Mndt      +
                    +---------------+
                           +
              +------------+----------+
       +------+---------+       +-----+-----+
       +   MndtReqId    +       +   Cdtr    +
       +----------------+       +-----------+
              +                       +
       +------------------+     +-----------+
       +  00081902E92D2109+     +    Nm     +
       +------------------+     +-----------+

  4. #4
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Tout d'abord merci de t'être arrêté pour me répondre
    Je ne sais pas si tu as vu mon Edit (en plein milieu de Post, pas terrible, j'avoue..) car nous avons posté en même temps.
    Je suis dslée mais malgré ton superbe schéma je n'y suis toujours pas..
    Pourquoi Est-ce que j'ai ce résultat [MndtInitnReq: null] pour e.getChildNodes() ?
    D'après ce que je vois de ton arbre DOM, les éléments sont une simple hiérarchisation (si je puis me permettre le terme) de mon xml, et chaque élément contient les champs CDATA, TEXT, Commentaires etc... comme sous-nœuds ? ceux-ci étant éventuellement à null ?
    Si j'ai juste, comment ces champs se remplissent-ils ? Est-ce que par défault, tout se met dans text ?

    Merci encore de prendre le temps de me répondre

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Le DOM est une représentation hierarchique sous forme d'arbre de la structure d'un document XML.

    Consernant l'affichage qui te donne [machin : null], ça ne veut pas dire que le noeud ne contient pas des fils. Mais simplement que la méthode toString() de la classe en question n'a été implémentée de manière à afficher tous les nœuds fils. L'affichage est en fait un peu délicat puisqu'on peut rencontrer plusieurs type de nœuds fils.
    Quand le document XML est parser, l'arbre est chargé en mémoire conformément au document en question. Sinon tu peux toujours ajouter ou supprimer d'autre nœuds de l'arbre.

    Pour te donner un exemple de l'affichage du document XML, voici un bout de code qui affiche tous les noeuds fils d'un noeuds père.
    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
     
    private void exploreXML(Node node, int esp)
        {
         for(int i=0; i<esp; i++)
          System.out.print("-");
         if(node.hasChildNodes())
         {
           System.out.println(node.getNodeName());
          NodeList liste = node.getChildNodes();
          for(int i=0; i<liste.getLength(); i++)
          {
           exploreXML(liste.item(i), esp+1);
          }
         }
         else if(node.getNodeType()!=node.TEXT_NODE)
           System.out.println(node.getNodeName());
         else if(node.getNodeValue().length()!=0)
           System.out.println("["+node.getNodeValue()+"]");
     
        }
    cette méthode appelé sur le noeuds racine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exploreXML(racine, 0);
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    document
    -MndtInitnReq
    --Mndt
    ---MndtReqId
    ----[00081902E92D2109]
    ---Cdtr
    ----Nm
    -----[AtomShop TEST BRED 1]
    ----PstlAdr
    -----TwnNm
    ------[41000 BLOIS]
    ----Id
    -----OrgId
    ------BICOrBEI
    -------[55209179500781]
    ---Dbtr
    ----Nm
    -----[Saita Chana]
    ---DbtrAcct
    ----Id
    -----IBAN
    ------[FR7614505000021234567890132]
    ---DbtrAgt
    ----FinInstnId
    -----BIC
    ------[CEPAFRPP450]

  6. #6
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    176
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 176
    Points : 61
    Points
    61
    Par défaut
    Merci pour cette réponse détaillée !
    J'ai tout compris ! Et merci pour le code qui me permet d'afficher l'arbre en détail. Je comprend mieux comment il faut s'y prendre.
    A bientot !

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

Discussions similaires

  1. [DOM][XML] Suppresion d'un noeud
    Par junix dans le forum Langage
    Réponses: 1
    Dernier message: 18/04/2011, 15h50
  2. [Débutant][XML Dom] object is null
    Par Stessy dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 28/10/2008, 10h29
  3. Réponses: 41
    Dernier message: 03/06/2008, 09h54
  4. [XML] [DOM(XML?)] Suppression d'un noeud XML en php
    Par ribrok dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 30/01/2007, 15h11
  5. [DOM] PHP5 et XML comment ajouter un noeud dans un noeud précis?
    Par titou250 dans le forum Bibliothèques et frameworks
    Réponses: 12
    Dernier message: 20/04/2006, 21h02

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