Création d'une appli pour fichiers XML
Bonjour à tous,
J'aimerai créer une petite application en utilisant Visual C++ 2010 Express, malheureusement je rencontre d'énormes difficultés car je ne suis pas du tout un programmeur c'est pourquoi votre aide me sera d'une grande utilité.
Explication du problème: J'utilise un logiciel graphique me permettant de saisir des schémas et qui les enregistre au format XML.
Exemple d'un fichier XML généré par le logiciel :
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 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
| <?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://www.plcopen.org/xml/tc6.xsd" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<fileHeader companyName="Universita di Napoli Federico II" companyURL="www.unina.it" productName="UniSim" productVersion="0.5.0" productRelease="B" creationDateTime="2007-12-31T23:59:59Z" contentDescription="Application" />
<contentHeader name="Test2" version="1" organization="TIMA" author="Micka">
<Comment />
<coordinateInfo>
<pageSize x="0" y="0" />
<fbd>
<scaling x="1" y="1" />
</fbd>
<ld>
<scaling x="1" y="1" />
</ld>
<sfc>
<scaling x="1" y="1" />
</sfc>
</coordinateInfo>
</contentHeader>
<types>
<dataTypes />
<pous>
<pou name="Grafcet" pouType="program">
<interface>
<localVars name="Grafcet - Local variables">
<variable name="a">
<type>
<BOOL />
</type>
<initialValue>
<simpleValue value="True" />
</initialValue>
</variable>
<variable name="b">
<type>
<BOOL />
</type>
<initialValue>
<simpleValue value="False" />
</initialValue>
</variable>
</localVars>
<tempVars name="Grafcet - Temporary variables" />
<inputVars name="Grafcet - Input variables" />
<outputVars name="Grafcet - Output variables" />
<inOutVars name="Grafcet - InOut variables" />
<externalVars name="Grafcet - External variables" />
<accessVars name="Grafcet - Accessible variables" />
<globalVars name="Grafcet - Global variables" />
</interface>
<body>
<SFC>
<step name="S0" height="44" width="44" localId="1" initialStep="true" negated="false">
<position x="350" y="66" />
<connectionPointIn>
<connection refLocalId="8" />
</connectionPointIn>
</step>
<step name="S1" height="44" width="44" localId="2" initialStep="false" negated="false">
<position x="350" y="146" />
<connectionPointIn>
<connection refLocalId="5" />
</connectionPointIn>
</step>
<step name="S2" height="44" width="44" localId="3" initialStep="false" negated="false">
<position x="350" y="238" />
<connectionPointIn>
<connection refLocalId="6" />
</connectionPointIn>
</step>
<step name="S3" height="44" width="44" localId="4" initialStep="false" negated="false">
<position x="350" y="322" />
<connectionPointIn>
<connection refLocalId="7" />
</connectionPointIn>
</step>
<transition height="44" width="44" localId="5">
<position x="368" y="128" />
<connectionPointIn>
<connection refLocalId="1" />
</connectionPointIn>
<condition>
<reference name="a" />
</condition>
</transition>
<transition height="44" width="44" localId="6">
<position x="368" y="216" />
<connectionPointIn>
<connection refLocalId="2" />
</connectionPointIn>
<condition>
<reference name="a" />
</condition>
</transition>
<transition height="44" width="44" localId="7">
<position x="368" y="304" />
<connectionPointIn>
<connection refLocalId="3" />
</connectionPointIn>
<condition>
<reference name="b" />
</condition>
</transition>
<transition height="44" width="44" localId="8">
<position x="300" y="216" />
<connectionPointIn>
<connection refLocalId="4" />
</connectionPointIn>
<condition>
<reference name="a" />
</condition>
</transition>
</SFC>
</body>
</pou>
</pous>
</types>
<instances>
<configurations>
<configuration name="MainConfiguration">
<resource name="MainResource">
<pouInstance name="Grafcet" type="program" />
</resource>
</configuration>
</configurations>
</instances>
</project> |
Dans ce fichier XML, seulement quelques informations m'intéressent, ce sont les steps et les transitions, elles se situent juste après la balise <SFC> (entre la ligne 51 et 112 du code ci-dessus).
Les informations que j'aimerai donc récupérer sont:
- Premièrement : le nombre total de STEP et de TRANSITION (ce nombre peut varier d'un fichier xml à un autre)
- Deuxièmement :
* Pour chaque STEP, le "name" (string), le "localID" (int), le "refLocalId" (int) et enfin le "InitialStep" (bool).
* Pour chaque TRANSITION, le "name" (string), le "localID" (int) et le "refLocalId" (int).
Après avoir vu le fichier XML, voici les fonctions de mon application que j'aimerai créer :
- Ouvrir un fichier .xml quelque soit son nom (car chaque fichier généré auparavant aura un nom différent)
- Récupérer les informations dont j'ai besoin comme expliqué un peu plus haut
- Traiter ces informations afin d'obtenir une matrice, mais pour l'instant cette partie n'est pas la priorité.
J'aimerai procéder étape par étape afin de bien tout comprendre et donc pour commencer, comment ouvrir un fichier .XML quelque soit son nom ?
J'ai vu que cette fonction pouvait surement convenir:
Code:
1 2 3 4 5
| public: Workbook^ OpenXML(
String^ Filename,
Object^ Stylesheets,
Object^ LoadOption
); |
Mais comment lier cette fonction à un bouton du style "menu" -> "ouvrir un fichier" -> "parcourir" ?
De plus, pour récupérer les informations dont j'ai besoin j'avais pensé à quelque chose du genre :
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
| class step{
public:
string name;
bool initialStep, negated;
int localId, refLocalId;
};
class transition{
public:
int localId, refLocalId;
};
list<step> step_list;
list<transition> transition_list;
TiXmlHandle hdl(&doc);
TiXmlElement *elem = hdl.FirstChildElement().FirstChildElement().FirstChildElement().FirstChildElement().FirstChildElement().Element();
step cl;
if(!elem){
cerr << "le noeud à atteindre n'existe pas" << endl;
return 2;
}
while (elem){
cl.name = elem->Attribute("name");
cl.pass = elem->Attribute("initialStep");
cl.pass = elem->Attribute("negated");
elem->QueryIntAttribute("localId", &cl.droits);
elem->QueryIntAttribute("refLocalId", &cl.droits);
step_list.push_back(cl);
elem = elem->NextSiblingElement(); // iteration
}
transition cl;
if(!elem){
cerr << "le noeud à atteindre n'existe pas" << endl;
return 2;
}
while (elem){
elem->QueryIntAttribute("localId", &cl.droits);
elem->QueryIntAttribute("refLocalId", &cl.droits);
transition_list.push_back(cl);
elem = elem->NextSiblingElement(); // iteration
}
list<step>::iterator i;
for(i=step_list.begin(); i!=step_list.end(); i++)
cout << i->name << " " << i->initialStep << " " << i->negated << " " << i->localId << " " << i->refLocalId << endl;
list<transition>::iterator i;
for(i=transition_list.begin(); i!=transition_list.end(); i++)
cout << i->localId << " " << i->refLocalId << endl;
{ |
Mais je doute que ça marche, et de plus je ne sais pas où y placer dans mon projet. Fichier.ccp ? Fichier.h ? Dans le main ?
Conclusion : I'm Lost :cry: et je pense que ce sujet pourra intéresser pas mal de personnes car j'ai fait de très nombreuses recherches et je n'ai jamais trouvé quelque chose de clair mis à part m'embarquer dans d’innombrables tuto (tinyXML, xPath, Xerces etc...).
Merci d'avoir pris le temps de lire ce sujet, j'attend avec impatience vos commentaires, vos conseils et bien entendu votre aide :)