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

  1. #1
    Membre à l'essai
    [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é
    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
    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é
    Et item(1) donne quoi comme nœud ?

    MAT.

  5. #5
    Membre à l'essai
    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é
    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
    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.