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

XML/XSL et SOAP Discussion :

parser un fichier avec xerces


Sujet :

XML/XSL et SOAP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut parser un fichier avec xerces
    Bonjour, je voudrais parser un fichier xml avec xerces et en afficher les noeuds. Tout simple!!!

    voici le fichier xml

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <?xml version="1.0" encoding="iso-8859-1"?>
     
    <personnel>
      <person id="Big.Boss" >
        <name><family>Boss</family> <given>Big</given></name>
      </person>
      <person id="one.worker">
        <name><family>Worker</family> <given>One</given></name>
        </person>
     </personnel>
    Je fais donc qq chose comme cela:
    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
     
     
    static const XMLCh gLS[] = { chLatin_L, chLatin_S, chNull };
    DOMImplementation *impl = DOMImplementationRegistry::getDOMImplementation(gLS);
    DOMBuilder        *parser = ((DOMImplementationLS*)impl)->createDOMBuilder(/*DOMImplementationLS::MODE_SYNCHRONOUS*/0, 0);
    DOMElement* racine = monDocDom->getDocumentElement();
     
    XERCES_STD_QUALIFIER cout << "racine : " << XMLString::transcode(racine->getTagName()) << XERCES_STD_QUALIFIER endl;
     
     
     
    DOMNodeList* maListeDeNoeuds = racine->getChildNodes();
    XERCES_STD_QUALIFIER cout << "nombre de noeuds : " << maListeDeNoeuds->getLength() << XERCES_STD_QUALIFIER endl;
    for(unsigned int i = 0; i< maListeDeNoeuds->getLength() ;i++)
    {
    	XERCES_STD_QUALIFIER cout << "noeud " << i << " -> " << XMLString::transcode(maListeDeNoeuds->item(i)->getNodeName()) << "." << XERCES_STD_QUALIFIER endl;
    }
    Le résultat affiché est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    racine : personnel
    nombre de noeuds : 5
    noeud 0 -> #text
    noeud 1 -> person
    noeud 2 -> #text
    noeud 3 -> person
    noeud 4 -> #text
    Voila, je tiens juste à remercier vivement celui qui pourra me dire d'ou sortent ces #text et comment je peux les supprimer..

    Merci d'avance donc.

    Seb

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 354
    Points : 15 700
    Points
    15 700

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Oui j'ai vu mais moi j'ai pas de méthode selectNodeList(). Et puis il doit forcement y avoir une autre solution.

  4. #4
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Salut,

    Les #text correspondent (ça parait logique) aux noeuds de classe Text de ton arbre DOM. Ces derniers sont générés lorsque le parser rencontre des données textuelles, par exemple entre l'element "personnel" et ton premier element "person" (et oui il y a un retour chariot et deux espaces : c'est du texte).
    Donc les 3 occurences de #text correspondent respectivement au passage entre "personnel" et "person", "/person" et "person", et enfin "person" et "/personnel".

    Pour t'en debarasser : deux solutions
    1) Soit tu es sur que ta liste ne contient que des elements, auquel cas tu peux tout simplement tester "maListeDeNoeuds->item(i)->getNodeType() != DOMNode::TEXT_NODE" avant d'afficher.
    2) Sinon tu definis un DTD ou un schema pour ton fichier XML et ainsi le parser saura reconnaitre les espaces significatifs des autres (moyennant un appel à la methode setIncludeIgnorableWhitespace() de ton instance de DOMParser).

    Cordialement,

    Phil

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Merci!!
    tu parles d'utiliser une DTD pour parser le document mais je m'y connais pas trop.
    Est ce que la DTD que j'ai pour l'instant conviendrait ou il faut que je la modifie pour virer ces #text?

    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
     
    <?xml encoding="ISO-8859-1"?>
     
    <!-- @version:  -->
     
    <!ELEMENT personnel (person)+>
    <!ELEMENT person (name,email*,url*,link?)>
    <!ATTLIST person id ID #REQUIRED>
    <!ELEMENT family (#PCDATA)>
    <!ELEMENT given (#PCDATA)>
    <!ELEMENT name (#PCDATA|family|given)*>
    <!ELEMENT email (#PCDATA)>
    <!ELEMENT url EMPTY>
    <!ATTLIST url href CDATA #REQUIRED>
    <!ELEMENT link EMPTY>
    <!ATTLIST link
      manager IDREF #IMPLIED
      subordinates IDREFS #IMPLIED>
    En tous cas, merci pour le coup de pouce.

    Seb

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Merci!!
    tu parles d'utiliser une DTD pour parser le document mais je m'y connais pas trop.
    Est ce que la DTD que j'ai pour l'instant conviendrait ou il faut que je la modifie pour virer ces #text?

    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
     
    <?xml encoding="ISO-8859-1"?>
     
    <!-- @version:  -->
     
    <!ELEMENT personnel (person)+>
    <!ELEMENT person (name,email*,url*,link?)>
    <!ATTLIST person id ID #REQUIRED>
    <!ELEMENT family (#PCDATA)>
    <!ELEMENT given (#PCDATA)>
    <!ELEMENT name (#PCDATA|family|given)*>
    <!ELEMENT email (#PCDATA)>
    <!ELEMENT url EMPTY>
    <!ATTLIST url href CDATA #REQUIRED>
    <!ELEMENT link EMPTY>
    <!ATTLIST link
      manager IDREF #IMPLIED
      subordinates IDREFS #IMPLIED>
    En tous cas, merci pour le coup de pouce.

    Seb

  7. #7
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Est ce que la DTD que j'ai pour l'instant conviendrait ou il faut que je la modifie pour virer ces #text?
    Non, non, c'est très bien comme ça puisque ta DTD indique bien que l'element "personnel" ne contient que des elements "person" (donc pas de texte). Ainsi, si le parser rencontre un espace ou un retour chariot il saura qu'il est non-significatif.
    Comme indiqué dans mon precedent post, il faut quand même "dire" à Xerces d'ignorer ces blancs via la methode setIncludeIgnorableWhitespace() de la classe DOMParser dont voici le prototype :

    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
       /** Set the 'include ignorable whitespace' flag
          *
          * This method allows the user to specify whether a validating parser
          * should include ignorable whitespaces as text nodes.  It has no effect
          * on non-validating parsers which always include non-markup text.
          * <p>When set to true (also the default), ignorable whitespaces will be
          * added to the DOM tree as text nodes.  The method
          * DOM_Text::isIgnorableWhitespace() will return true for those text
          * nodes only.
          * <p>When set to false, all ignorable whitespace will be discarded and
          * no text node is added to the DOM tree.  Note: applications intended
          * to process the "xml:space" attribute should not set this flag to false.
          * And this flag also overrides any schema datateye whitespace facets,
          * that is, all ignorable whitespace will be discarded even though
          * 'preserve' is set in schema datatype whitespace facets.
          *
          * @param include The new state of the include ignorable whitespace
          *                flag.
          *
          * @see #getIncludeIgnorableWhitespace
          */
        void setIncludeIgnorableWhitespace(const bool include);
    Cordialement,

    Phil

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Dernieres petites question et puis je te laisse tranquil:

    J'utilise à la base un objet DOMBuilder pour parser mes documents. Je n'ai pas réussi à faire un lien entre l'ojets DOMBuilder et une méthode setIncludeIgnorableWhitespace().

    Comment faire?

    Dans la doc de l'API j'ai trouvé la methode setIncludeIgnorableWhitespace() dans la classe abstractDOMParser. Par ailleurs la classe DOMParser dont tu parles n'est pas documentée mais j'ai pu trouver ses sources dans un dossier intitulé "deprecated". Faut il vraiment utilisé cet objet quand meme?

    Est ce que par le biais de la methode DOMBuilder::setFeature, on peut pas préciser un fonctionnement similaire à celui qu'entraine setIncludeIgnorableWhitespace()?

    Merci beaucoup pour ces dernieres réponses.

    Seb

  9. #9
    Membre du Club Avatar de philemon_siclone
    Inscrit en
    Septembre 2003
    Messages
    67
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 67
    Points : 67
    Points
    67
    Par défaut
    Par ailleurs la classe DOMParser dont tu parles n'est pas documentée mais j'ai pu trouver ses sources dans un dossier intitulé "deprecated". Faut il vraiment utilisé cet objet quand meme?
    Non, tu as tout à fait raison d'utiliser DOMBuilder à la place. En fait je ne savais pas que DOMParser était "deprecated" : mes connaissances concernant Xerces commencent à dater un peu.

    Est ce que par le biais de la methode DOMBuilder::setFeature, on peut pas préciser un fonctionnement similaire à celui qu'entraine setIncludeIgnorableWhitespace()?
    Tu as encore raison (decidement, j'ai pas l'impression de servir à grand chose : c'est plutot toi qui m'apprend des trucs (merci, d'ailleurs)). J'ai trouvé la "feature" équivalente dans la doc de l'API: elle s'appelle "whitespace-in-element-content", et dans ton cas il faut la mettre à "false". Sa description se trouve à l'adresse suivante :http://xml.apache.org/xerces-c/progr...uilderFeatures

    Tcho,

    Phil

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 98
    Points : 75
    Points
    75
    Par défaut
    Merci beaucoup.
    Ca marchera demain!

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

Discussions similaires

  1. Parser un fichier avec JavaScript
    Par happy_man dans le forum Ext JS / Sencha
    Réponses: 3
    Dernier message: 21/05/2013, 19h53
  2. Parser un fichier avec sax
    Par zalalus dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 21/01/2009, 12h11
  3. parser un fichier avec header
    Par czezko dans le forum Windows Forms
    Réponses: 8
    Dernier message: 08/01/2009, 14h52
  4. duree pour parser un fichier avec un script awk
    Par kass28 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 26/03/2008, 16h35
  5. problème pour parser un fichier xml avec XML::Simple
    Par black_code dans le forum Modules
    Réponses: 3
    Dernier message: 30/01/2006, 19h32

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