2010-06-01 4 views
-1

Salut Je travaille sur une application qui lit un fichier XML. Ici, j'essaie de lire le nœud "nom" sous le nœud "a" qui n'est pas sous le nœud "b". Lorsque j'ai essayé de lire le nœud "nom" racine, j'obtiens les deux nœuds. S'il vous plaît aidez-moi à résoudre le problème. Bellow est l'échantillon.lire l'élément racine en XML et non l'enfant

<a>  
     <x>rrr</X> 
     <b> 
     <name> 123 </name> 
     </b> 
     <name> main </name> 
     <c>yyyy</c> 
    </a> 





    QDomDocument mDocument; 
    QDomElement mDocumentElement; 
    if (!mDocument.setContent(file.readAll())) 
    {   
     return ;  
    }  

    mDocumentElement = mDocument.documentElement(); 
    QDomNodeList list = mDocumentElement.elementsByTagName("a").at(0).toElement().elementsByTagName("name"); 

    int count = list.count(); 
    for (int i = 0; i < count; i++) 
    { 
     QString str = list.at(i).nodeValue(); 
     QMessageBox::information(this, "text", str, QMessageBox::Yes, 0); 
    } 
+0

First i Je ne comprends pas votre question. Ensuite, je ne vois pas de XML. Pouvez-vous s'il vous plaît modifier votre question une fois ?? – liaK

Répondre

1

Si votre XML traversal est basé sur la structure et non en fonction du type de contenu, vous pouvez suivre cette ..

QDomDocument mDocument; 
QDomElement mDocumentElement; 
if (!mDocument.setContent(file.readAll())) 
{   
    return ;  
}  

mDocumentElement = mDocument.documentElement(); 
QDomNodeList list = mDocumentElement.childNodes(); 
QDomElement firstChild = list.at(0).toElement(); // will return the first child 
QDomElement secondChild = list.at(1).toElement(); // second child 
    ...... 

Pour obtenir les données présentes entre les balises,

QString childData = firstChild.text(); 

peut être utilisé. De même, vous pouvez traverser jusqu'à votre <name> désiré et sa valeur peut être utilisée. Rappelez-vous childNodes() retournera uniquement la liste des enfants directs. Espérons que je suis clair. Il n'est pas testé mais devrait fonctionner.

0

Vous pouvez effectuer une itération sur les enfants directs de l'élément "a" en utilisant QDomNode :: firstChild (QString tagName) et QDomNode :: nextSiblingElement (QString tagName). La volonté de code ressemble à:

QDomDocument mDocument; 
if (!mDocument.setContent(file.readAll())) 
{   
    return ;  
} 

QDomElement mElement = mDocument.documentElement().firstChildElement("name"); 
while (!mElement.isNull()) 
{ 
    // do all you need to do with <name> element 
    mElement = mElement.nextSiblingElement("name"); 
} 

Je l'ai testé ce code sur votre XML exemple et il fonctionne si vous fixer non-concordance de tag sur cette ligne: <x> rrr </X >