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 Discussion :

[Xerces-C++] getElementsByTagName : lecture des attributs


Sujet :

XML

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 16
    Points
    16
    Par défaut [Xerces-C++] getElementsByTagName : lecture des attributs
    Bonjour

    J'ai un document xml et j'essaie d'accéder à la balise nuclear_loci puis de savoir s'il a des attributs.
    Cette balise a effectivement un attribut.
    Quand je lance mon code suivant il me dit qu'il n'y pas de balise
    Voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	DOMNodeList *listDomElement = (modelParam->doc)->getElementsByTagName(XMLString::transcode("nuclear_loci"));
     
    	qDebug() << "Nb element nuclear" << listDomElement->getLength();
    	qDebug() << "Nom du premier" <<	QString::fromStdString( XMLString::transcode( ((listDomElement->item(0))->getNodeName()) ) );
     
    	if (listDomElement->item(0)->hasAttributes())
    		qDebug() << "DomNode a des attr";
    	else 
    		qDebug() << "DomNode n'a pas d'attr";
    donc voici un extrait du document xml

    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"?>
    <!DOCTYPE xml>
    <xml> 
    <genome>
    	<cytoplasmic_loci checked="true" number="48" average="35,88" variance = "8,00"></cytoplasmic_loci>
    	<nuclear_loci checked="true" total_number="45">
    		<dominant checked="false" number="34" average="35,88" variance = "35,88"></dominant>
    		<codominant checked="false" number="23" average="35,88" variance = "6,00"></codominant>
    		<QTL checked="true" number="56" average="65,77" variance = "8,00"></QTL>
    		<anonymous checked="true" number="34" average="5,5" variance = "8,4"></anonymous>
    	</nuclear_loci>
    ...
    </genome>
    ...
    </xml>
    voici la trace que les qDebug() produise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Nb element nuclear 1
    Nom du premier "nuclear_loci"
    DomNode n'a pas d'attr
    Je ne vois pas ce que j'ai fais de travers, est ce que vous avez une idée.
    Merci d'avance

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Tu devrais tester le type de DOMNode que te renvoie le item(0), à tous les coups c'est un DOMText qui correspond aux espaces qui se trouvent avant le nœud dominant.

    Sinon essaye d'utiliser DOMPrint qui est filé dans les samples en lui donnant ton fichier XML, il va te lister les nœuds rencontrés.

    MAT.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Salut,

    Tu devrais tester le type de DOMNode que te renvoie le item(0), à tous les coups c'est un DOMText qui correspond aux espaces qui se trouve avant le nœud dominant.

    Sinon essaye d'utiliser DOMPrint qui est filé dans les samples en lui donnant ton fichier XML, il va te lister les nœuds rencontrés.

    MAT.
    Bonjour et merci de ton aide

    Je lui fait renvoyer le type du nœud:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qDebug() << "Type du noeud : " << listDomElement->item(0)->getNodeType();
    Il renvoie le short 1 donc DOMElement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    entre dans updateQGroupBoxModel
    Nb element nuclear 1
    Nom du premier "nuclear_loci"
    Type du noeud :  1
    DomNode n'a pas d'attr
    Pour DOMPrint, je l'ai lancé sur mon fichier je ne vois rien de choquant.

    ça me laisse vraiment perplexe, il y'a peut être un truc évident que j'ai loupé mais je ne sais pas quoi

    Merci encore
    Frédéric

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Et item(1) donne quoi comme nœud ?

    MAT.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Citation Envoyé par Mat007 Voir le message
    Et item(1) donne quoi comme nœud ?

    MAT.
    Re

    en testant l'item(1) le programme plante.
    Je lui fait afficher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     listDomElement->getLength()
    Il m'indique bien qu'il a un seul DOMNode dans cette liste.

    Merci encore de ton aide
    Frédéric

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Et si tu fais la boucle à la main pour voir, style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        DOMNode* pChild = modelParam->doc->getFirstChild()->getFirstChild();
        while( pChild )
        {
            if( pChild->getNodeType() == DOMNode::ELEMENT_NODE && translate( pChild->getNodeName() ) == "nuclear_loci" )
            {
                  // ...
            }
            pChild = pChild->getNextSibling();
        }
    Au fait les XMLString::transcode que tu fais je pense qu'il faut les désallouer et que là ils fuient de la mémoire...
    C'est ce que fait ma classe translate là en l'occurence, en utilisant du RAII.
    Mais bon c'est pas le problème actuel à la limite.

    MAT.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 16
    Points : 16
    Points
    16
    Par défaut
    Bonjour Mat et merci de ton aide

    Mea maxima culpa
    J'ai fais une grosse betise en fait
    Je travaille sur les attributs avec un DOMNamedNodeMap et puis j'ai fait des removeNamedItem.
    Cette méthode supprime les attributs.
    C'est après que je tente de les lire, bien sur je n'y arrive pas car ils n'y sont plus

    Frédéric

    Citation Envoyé par Mat007 Voir le message
    Et si tu fais la boucle à la main pour voir, style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        DOMNode* pChild = modelParam->doc->getFirstChild()->getFirstChild();
        while( pChild )
        {
            if( pChild->getNodeType() == DOMNode::ELEMENT_NODE && translate( pChild->getNodeName() ) == "nuclear_loci" )
            {
                  // ...
            }
            pChild = pChild->getNextSibling();
        }
    Au fait les XMLString::transcode que tu fais je pense qu'il faut les désallouer et que là ils fuient de la mémoire...
    C'est ce que fait ma classe translate là en l'occurence, en utilisant du RAII.
    Mais bon c'est pas le problème actuel à la limite.

    MAT.

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. Inhiber l'ordre alphabétique des attributs sous Xerces
    Par philippe rousseau dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 04/12/2003, 17h19
  3. Sauvegarde des attributs de texte en fichier ini
    Par Raylemon dans le forum Langage
    Réponses: 2
    Dernier message: 06/09/2003, 21h28
  4. Réponses: 4
    Dernier message: 23/07/2003, 13h07
  5. Une fonction avec des attributs non obligatoires
    Par YanK dans le forum Langage
    Réponses: 5
    Dernier message: 15/11/2002, 13h39

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