2013-06-27 3 views
0

-je obtenir le code XML suivantQT5 C++ QByteArray XML Parser

<Tra Type="SomeText"> 
    <tr>Abcdefghij qwertzu</tr> 
    <Rr X="0.0000" Y="0.0000" Z="0.0000" A="0.0000" B="0.0000" C="0.0000" /> 
    <Ar A1="0.0000" A2="0.0000" A3="0.0000" A4="0.0000" A5="0.0000" A6="0.0000" /> 
    <Er E1="0.0000" E2="0.0000" E3="0.0000" E4="0.0000" E5="0.0000" E6="0.0000" /> 
    <Te T21="1.09" T22="2.08" T23="3.07" T24="4.06" T25="5.05" T26="6.04" T27="7.03" T28="8.02" T29="9.01" T210="10.00" /> 
    <D>125</D> 
    <IP></IP> 
</Tra> 

à travers un socket qui enregistre dans un QByteArray appelé Data.

Je veux extraire et enregistrer chaque valeur du xml à différentes variables (certaines en tant que nombres entiers que QString).

Mon problème principal est que je ne sais pas comment distinguer les chaînes xml comme <D>125</D> avec une valeur entre les balises et les chaînes xml comme <Te T210="10.00" T29="9... /> qui ont la valeur dans le Tag-String lui-même.

Mon code ressemble à ceci jusqu'à présent:

+0

Cela dépend du schéma de votre XML -. readElementText() pour utiliser texte à l'intérieur de l'élément, et attributs() pour accéder aux attributs. –

Répondre

0

Il y a tellement d'exemples déjà, ne sont pas là? . = (

Quoi qu'il en soit, comme Frank a dit, si vous voulez lire des données (caractères) à l'intérieur des balises - utiliser QXmlStreamReader::readElementText

Vous pouvez faire ceci:

QXmlStreamReader reader(xml); 
while(!reader.atEnd()) 
{ 
    if(reader.isStartElement()) 
    { 
    if(reader.name() == "tr") 
    { 
     reader.readNext(); 

     if(reader.atEnd()) 
     break; 

     if(reader.isCharacters()) 
     { 
     // Here is the text that is contained within <tr> 
     QString text = reader.text().toString(); 
     } 
    } 
    } 

    reader.readNext(); 
} 

Pour les attributs, vous devrait utiliser QXmlStreamReader::attributes qui vous donnera une classe de type conteneur de attributes

QXmlStreamReader reader(xml); 
while(!reader.atEnd()) 
{ 
    if(reader.isStartElement()) 
    { 
    if(reader.name() == "Rr") 
    { 
     QXmlStreamAttributes attributes = reader.attributes(); 
     // This doesn't check if the attribute exists... just a warning. 
     QString x = attributes.value("X").toString(); 
     QString y = attributes.value("Y").toString(); 
     QString a = attributes.value("A").toString(); 
     // etc... 
    } 
    } 

    reader.readNext(); 
} 
+0

merci beaucoup! Je suis nouveau en qt et C++. Je sais qu'il y a beaucoup de questions assez similaires à cela, mais elles sont encore un peu différentes et c'est difficile pour moi de faire la distinction entre important et sans importance. en tous cas. gros thx! – beary

+0

une autre question. pourquoi suis-je incapable d'imprimer les QStrings (par exemple qDebug() << x;) hors de la boucle while? Qt dit qu'il n'y a pas d'identificateur déclaré pour x. – beary

+0

probablement que la variable est sortie du champ d'application? peut-être vous devez inclure Huy