[XML][tinyXML] Problême d'extraction de données XML ac tinyxml
Bonjour à tous!
J'aimerais extraire les données d'un fichier xml mais je rencontre un problême ac les différents noeuds! J'utilise tinyxml
Je vous link un bout de mon fichier xml pour vous montrer mon probleme ;)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?xml version="1.0" encoding="utf-8" ?>
- <!-- Commentss: XmlWriter Bulletin Meteorem
-->
- <forecast>
- <localization value="Rillieuxlapape_69">
- <day value="01/12/05">
<sunrise>08:01</sunrise>
<sunset>16:57</sunset>
- <hour value="06:00">
<weather>Ensoleillé</weather>
<code>0</code>
<temperature>-2</temperature>
<winddirection>Sud-Ouest</winddirection>
<windforce>6</windforce>
</hour>
- <hour value="12:00">
<weather>Ensoleillé</weather>
<code>0</code>
<temperature>2</temperature>
<winddirection>Sud</winddirection>
<windforce>12</windforce>
</hour>
- <hour value="18:00">
<weather>Ensoleillé</weather>
<code>0</code>
<temperature>3</temperature>
<winddirection>Sud</winddirection>
<windforce>20</windforce>
</hour>
</day> |
En gros j'arrive à extraire toutes les données jusqu'à la ligne
<windforce>6</windforce>
Mais je n'arrive pas à continuer l'extraction apres le noeud suivant c'est à dire: <hour value="12:00">
Pour résumer je n'arrive pas (je ne connais pas les commandes) à extraire les diffénrents block (sauf le premier block) en dessous des balises indiquant l'heure.
Je vous link mon programme pour vous montrer un peu ou j'en suis :D
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <DOS.H>
#include <iostream>
#include <stdio>
#include <stdlib>
#include "tinyxml.h"
#include "define.h"
int idSemaphoreAlloc ;
int idSemaphoreFichier ;
//*********************** Classe Meteo *********************************
//création d'une classe météo permettant de récupérer les données de 3 champs
//du fichier XML (localization, day, hour)
class meteo
{
public:
const char* localization;
const char* day;
const char* hour;
};
//************************* MAIN ***********************************
int main(void)
{
//Séléction du fichier XML dont il faudra extraire les données
TiXmlDocument doc("rill.xml");
//Erreur lors de la recherhce du fichier XML
if(!doc.LoadFile())
{
cerr << "erreur lors du chargement" << endl;
cerr << "error #" << doc.ErrorId() << " : " << doc.ErrorDesc() << endl;
return 1;
}
//Création d'un objet de type TiXmlHandle avec en paramètre doc qui permettra
//par la suite la récupération des informations entre les balises
TiXmlHandle hdl(&doc);
//création de elem qui permettra de récupérer les informations du fichier XML en fonction de la balise choisie
TiXmlElement *ele = hdl.FirstChildElement("forecast").FirstChildElement("localization").Element();
TiXmlElement *ele1 = hdl.FirstChildElement("forecast").FirstChildElement("localization").FirstChildElement("day").Element();
TiXmlElement *ele2 = hdl.FirstChildElement("forecast").FirstChildElement("localization").FirstChildElement("day").FirstChildElement("hour").Element();
TiXmlElement* elem = hdl.FirstChildElement("forecast").FirstChildElement("localization").FirstChildElement("day").FirstChildElement("sunrise").Element();
TiXmlElement* elem2 = hdl.FirstChildElement("forecast").FirstChildElement("localization").FirstChildElement("day").FirstChildElement("hour").FirstChildElement("weather").Element();
//boucle pour vérifier que l'élément ait bien un enfant
if(!elem)
cout<<"l'element n'a pas enfant"<<endl;
//création d'un objet cl de la classe meteo
meteo cl;
//sleep pour permettre un bon affichage des données sur telnet
sleep(1);
cout<<endl;
//Récupération de la valeur du champ "localization"
cl.localization = ele->Attribute("value");
cout<<"localization:"<<cl.localization<<endl;
//boucle permettant de récupérer la valeur du champ "day"
while(ele1)
{
cl.day = ele1->Attribute("value");
cout<<"day:"<<cl.day<<endl;
//boucle permettant de récupérer la valeur du champ "sunrise" et "sunset"
while(elem)
{
if(elem->GetText()) //n'affiche pas le nom des balises des champs vides
cout << elem->Value() // Recupere le nom de la balise
<<":"<< elem->GetText() << endl; // Recupere le texte entre les balises
elem=elem->NextSiblingElement(); //on passe a l'enfant suivant
}
//boucle permettant de récupérer la valeur du champ "hour"
while(ele2)
{
cl.hour = ele2->Attribute("value");
cout<<"hour:"<<cl.hour<<endl;
ele2=ele2->NextSiblingElement();
//boucle permettant de récupérer la valeur du champ "weather" à "windforce"
while(elem2)
{
cout << elem2->Value() <<":"<< elem2->GetText() << endl;
elem2=elem2->NextSiblingElement();
}//fin boucle elem2
}//fin boucle ele2
ele1=ele1->NextSiblingElement();
}//fin boucle ele1
}//fin du programme |