Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

parser fichier XML dans un programme C

13 réponses
Avatar
mah chab
Salut,

Je voudrais parser un fichier XML dont le but est d'extraire des
informations pour les utiliser apr=E8s dans mon programme C.

- il y a des librairies d=E9finies sous visaul studio 2008 pour parser
des fichiers XML dans un programme C ?

- Sinon. il y a autres solutions ?

- Pouvez vous me donner un exemple de programme C sous Windows qui
permet de parser un fichier XML ?

Merci.

10 réponses

1 2
Avatar
Christian ASTOR
mah chab wrote:

Je voudrais parser un fichier XML dont le but est d'extraire des
informations pour les utiliser après dans mon programme C.
- il y a des librairies définies sous visaul studio 2008 pour parser
des fichiers XML dans un programme C ?
- Pouvez vous me donner un exemple de programme C sous Windows qui
permet de parser un fichier XML ?



Cela a déjà été répondu (IXMLDocument et autres, divers exemples venant
de MSDN)
En C, c'est pareil sauf que ça modifie et complique la syntaxe, donc je
ne vois pas pourquoi tu ne veux pas compiler en .cpp

Par exemple,
hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDocument, (void**)&pDoc);
devient
hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDocument, (void**)&pDoc);

et il faut rajouter des "->lpVtbl" partout...

Alors qu'un copier-coller des exemples MS et c'est terminé...
Avatar
mah chab
On 24 juil, 18:59, Christian ASTOR wrote:
mah chab wrote:
> Je voudrais parser un fichier XML dont le but est d'extraire des
> informations pour les utiliser après dans mon programme C.
> - il y a des librairies définies sous visaul studio 2008 pour parser
> des fichiers XML dans un programme C ?
> - Pouvez vous me donner un exemple de programme C sous Windows qui
> permet de parser un fichier XML ?

Cela a déjà été répondu (IXMLDocument et autres, divers exemple s venant
de MSDN)
En C, c'est pareil sauf que ça modifie et complique la syntaxe, donc je
ne vois pas pourquoi tu ne veux pas compiler en .cpp

Par exemple,
hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDocument, (void**)&pDoc);
devient
hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDocument, (void**)&pDoc);

et il faut rajouter des "->lpVtbl" partout...

Alors qu'un copier-coller des exemples MS et c'est terminé...



Salut,

1) quelle est la source (site, document,..) de votre exemple et
comment vous savez les modifications à faire au dessus ?

1) Si je continue à programmer avec C alors comment je sais la
modification à faire sur le code c++ comme vous avez fait au dessus ?

2) Je n'ai pas encore terminé mon programme C qui contient des
fonctions et je pense aussi à faire des modules *.h pour grouper les
traitements fréquents (ce programme n'est pas la version finale).
- Est ce que je peux migrer vers C++ ?
- Il y aura des modifications à faire ?
- Si je copie un programme C dans un nouveau programme vide C++ et je
ne fais pas aucune modification alors il aura pas des problèmes ?
Sinon donc quel est l'avantage de C++ dans ce cas ?
- C'est logique de créer un projet C++ et écrire dedans de code C.

3) Au niveau temps d'exécution (plus rapide), c'est mieux d'utiliser C
ou C++ ?

4) le code C++ est portable ?

5) Si on pense à exécuter un programme sur plusieurs machines alors
c'est mieux d'utiliser C ou C++ ?

Merci.
Avatar
Christian ASTOR
mah chab wrote:

1) quelle est la source (site, document,..) de votre exemple et
comment vous savez les modifications à faire au dessus ?



C'est juste dans la doc, COM notamment.
Par exemple pour les VTables :
http://msdn.microsoft.com/en-us/library/ms713494(VS.85).aspx

Mais il vaut mieux donc utiliser la syntaxe C++, plus souple.

Donc une fois que l'on a l'interface IXMLDocument,
IXMLDocument::put_URL(),
IXMLDocument::get_root(),
IXMLElementCollection::get_children(), etc... et le fichier XML est
parsé assez simplement.

ou avec IXMLDOMDocument et l'exemple sample1.cpp du Windows SDK
(..SamplesWebxmlc++_samples)
et divers exemples qui s'en inspirent :
http://www.endurasoft.com/vcd/msxml1.htm
Avatar
mah chab
On 25 juil, 12:16, Christian ASTOR wrote:
mah chab wrote:
> 1) quelle est la source (site, document,..) de votre exemple et
> comment vous savez les modifications à faire au dessus ?

C'est juste dans la doc, COM notamment.
Par exemple pour les VTables :http://msdn.microsoft.com/en-us/library/ms7 13494(VS.85).aspx

Mais il vaut mieux donc utiliser la syntaxe C++, plus souple.

Donc une fois que l'on a l'interface IXMLDocument,
IXMLDocument::put_URL(),
IXMLDocument::get_root(),
IXMLElementCollection::get_children(), etc... et le fichier XML est
parsé assez simplement.

ou avec IXMLDOMDocument et l'exemple sample1.cpp du Windows SDK
(..SamplesWebxmlc++_samples)
et divers exemples qui s'en inspirent :http://www.endurasoft.com/vcd/msxm l1.htm



Salut,

Le choix de travailler avec C n'est pas choix. C'est exigé.

Pouvez-vous m'aider et m'expliquer pas à pas pour parser un fichier
XML dans mon programme C ?
Avatar
mah chab
On 25 juil, 12:16, Christian ASTOR wrote:
mah chab wrote:
> 1) quelle est la source (site, document,..) de votre exemple et
> comment vous savez les modifications à faire au dessus ?

C'est juste dans la doc, COM notamment.
Par exemple pour les VTables :http://msdn.microsoft.com/en-us/library/ms7 13494(VS.85).aspx

Mais il vaut mieux donc utiliser la syntaxe C++, plus souple.

Donc une fois que l'on a l'interface IXMLDocument,
IXMLDocument::put_URL(),
IXMLDocument::get_root(),
IXMLElementCollection::get_children(), etc... et le fichier XML est
parsé assez simplement.

ou avec IXMLDOMDocument et l'exemple sample1.cpp du Windows SDK
(..SamplesWebxmlc++_samples)
et divers exemples qui s'en inspirent :http://www.endurasoft.com/vcd/msxm l1.htm



Salut,

Le choix de travailler avec C n'est pas choix. C'est exigé.

Vous dites:
Par exemple,
hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDocument, (void**)&pDoc);
devient
hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDocument, (void**)&pDoc);

- Comment je peux savoir où je vais ajouter ces adresses & dans les
paramètres ?

vous dites :
et il faut rajouter des "->lpVtbl" partout...

- Où exactement je vais ajouter "->lpVtbl" dans le programme devant
et après quoi ?


- Pouvez-vous m'aider et m'expliquer pas à pas pour parser un fichier
XML dans mon programme C ?

Merci.

-
Avatar
Christian ASTOR
mah chab wrote:

Vous dites:
Par exemple,
hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
IID_IXMLDocument, (void**)&pDoc);
devient
hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDocument, (void**)&pDoc);

- Comment je peux savoir où je vais ajouter ces adresses & dans les
paramètres ?



Comme j'ai mis : 1er et 4ème paramètre de CoCreateInstance()

- Où exactement je vais ajouter "->lpVtbl" dans le programme devant
et après quoi ?



Comme déjà cité :
http://msdn.microsoft.com/en-us/library/ms713494(VS.85).aspx
ce qui donne =>

RESULT hr = S_OK;
IXMLDocument *pDoc = NULL;
TCHAR szPath[MAX_PATH];
lstrcpy(szPath, TEXT("test.xml"));
hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDocument, (void**)&pDoc);
hr = pDoc->lpVtbl->put_URL(pDoc, szPath);
// etc.. suivre la doc
Avatar
mah chab
On 26 juil, 17:01, Christian ASTOR wrote:
mah chab wrote:
> Vous dites:
> Par exemple,
> hr = CoCreateInstance(CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
> IID_IXMLDocument, (void**)&pDoc);
> devient
> hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
> &IID_IXMLDocument, (void**)&pDoc);

> - Comment je peux savoir où je vais ajouter ces adresses & dans les
> paramètres ?

Comme j'ai mis : 1er et 4ème paramètre de CoCreateInstance()

> - Où exactement je vais ajouter  "->lpVtbl"  dans le programme de vant
> et après quoi ?

Comme déjà cité :http://msdn.microsoft.com/en-us/library/ms713494(V S.85).aspx
ce qui donne =>

RESULT hr = S_OK;
IXMLDocument *pDoc = NULL;
TCHAR szPath[MAX_PATH];
lstrcpy(szPath, TEXT("test.xml"));
hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
&IID_IXMLDocument, (void**)&pDoc);
hr = pDoc->lpVtbl->put_URL(pDoc, szPath);
// etc.. suivre la doc







Bonjour,

J'ai bien installé Libxml2 dans mon projet de travail. Il me reste
comment je vais l'utiliser dans mon programme C. De plus, je ne trouve
pas des exemples simples sous Windows.
Je voudrais lire des informations à partir d'un fichier XML pour les
utiliser après dans mon programme C. Ce fichier XML est assez
volumineux. Ce fichier a une structure bien définie.
En général voici la structure de ce fichier:
On trouve :
- le type de document
- le nombre d'objets, le nombre d'attributs et le nombre des concepts
- le nom de lattice
- la liste des objets
- le liste des attributs
- la liste des concepts

Je m'intéresse à liste des concepts dans mon programme C.

Voici en général la structure de ce fichier "nom.lat.xml"

<Galicia_Document>

<Lattice numberObj="5" numberAtt="4" numberCpt="11">

<Name>lattice(essai)</Name>

<Object>3</Object>

.....

<Object>4</Object>

<Attribute>b</Attribute>

........

<Attribute>a</Attribute>

<Concept>

<ID> 1 </ID>

<Extent>

<Object_Ref>3</Object_Ref>

<Object_Ref>2</Object_Ref>

<Object_Ref>1</Object_Ref>

<Object_Ref>5</Object_Ref>

<Object_Ref>4</Object_Ref>

</Extent>

<Intent>

</Intent>

<UpperCovers>

</UpperCovers>

........

.........

.......

<ID> 11 </ID>

<Extent>

</Extent>

<Intent>

<Attribute_Ref>d</Attribute_Ref>

<Attribute_Ref>b</Attribute_Ref>

<Attribute_Ref>c</Attribute_Ref>

<Attribute_Ref>a</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>10</Concept_Ref>

<Concept_Ref>8</Concept_Ref>

<Concept_Ref>9</Concept_Ref>

<Concept_Ref>7</Concept_Ref>

</UpperCovers>



</Concept>





Comment je vais positionner sur le dernier identifiant <ID> 11 </ID>
pour extraire toutes les valeurs de balise <Attribute_Ref> </
Attribute_Ref> qui existent entre les deux balises
<Intent> </Intent> ?

<Intent>
<Attribute_Ref>d</Attribute_Ref>
<Attribute_Ref>b</Attribute_Ref>
<Attribute_Ref>c</Attribute_Ref>
<Attribute_Ref>a</Attribute_Ref>
</Intent>


Ces valeurs d, b, c et a je vais les utiliser dans mon programme C.
Aussi de même, je veux lire les valeurs 10, 8, 9 et 7 entre les deux
balises <Concept_Ref> </Concept_Ref> qui existent sous les balises
<UpperCovers> </UpperCovers>

<UpperCovers>
<Concept_Ref>10</Concept_Ref>
<Concept_Ref>8</Concept_Ref>
<Concept_Ref>9</Concept_Ref>
<Concept_Ref>7</Concept_Ref>
</UpperCovers>

Voici mon fichier XML complet nommé "essai.lat.xml":

<Galicia_Document>

<Lattice numberObj="5" numberAtt="4" numberCpt="11">

<Name>lattice(essai)</Name>

<Object>3</Object>

<Object>2</Object>

<Object>1</Object>

<Object>5</Object>

<Object>4</Object>

<Attribute>d</Attribute>

<Attribute>b</Attribute>

<Attribute>c</Attribute>

<Attribute>a</Attribute>

<Concept>

<ID> 1 </ID>

<Extent>

<Object_Ref>3</Object_Ref>

<Object_Ref>2</Object_Ref>

<Object_Ref>1</Object_Ref>

<Object_Ref>5</Object_Ref>

<Object_Ref>4</Object_Ref>

</Extent>

<Intent>

</Intent>

<UpperCovers>

</UpperCovers>

</Concept>

<Concept>

<ID> 2 </ID>

<Extent>

<Object_Ref>1</Object_Ref>

<Object_Ref>5</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>a</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>1</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 5 </ID>

<Extent>

<Object_Ref>2</Object_Ref>

<Object_Ref>5</Object_Ref>

<Object_Ref>4</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>b</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>1</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 4 </ID>

<Extent>

<Object_Ref>3</Object_Ref>

<Object_Ref>1</Object_Ref>

<Object_Ref>4</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>c</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>1</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 3 </ID>

<Extent>

<Object_Ref>3</Object_Ref>

<Object_Ref>2</Object_Ref>

<Object_Ref>5</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>d</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>1</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 8 </ID>

<Extent>

<Object_Ref>1</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>c</Attribute_Ref>

<Attribute_Ref>a</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>2</Concept_Ref>

<Concept_Ref>4</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 9 </ID>

<Extent>

<Object_Ref>4</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>b</Attribute_Ref>

<Attribute_Ref>c</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>5</Concept_Ref>

<Concept_Ref>4</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 6 </ID>

<Extent>

<Object_Ref>2</Object_Ref>

<Object_Ref>5</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>d</Attribute_Ref>

<Attribute_Ref>b</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>5</Concept_Ref>

<Concept_Ref>3</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 7 </ID>

<Extent>

<Object_Ref>3</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>d</Attribute_Ref>

<Attribute_Ref>c</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>4</Concept_Ref>

<Concept_Ref>3</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 10 </ID>

<Extent>

<Object_Ref>5</Object_Ref>

</Extent>

<Intent>

<Attribute_Ref>d</Attribute_Ref>

<Attribute_Ref>b</Attribute_Ref>

<Attribute_Ref>a</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>2</Concept_Ref>

<Concept_Ref>6</Concept_Ref>

</UpperCovers>

</Concept>

<Concept>

<ID> 11 </ID>

<Extent>

</Extent>

<Intent>

<Attribute_Ref>d</Attribute_Ref>

<Attribute_Ref>b</Attribute_Ref>

<Attribute_Ref>c</Attribute_Ref>

<Attribute_Ref>a</Attribute_Ref>

</Intent>

<UpperCovers>

<Concept_Ref>10</Concept_Ref>

<Concept_Ref>8</Concept_Ref>

<Concept_Ref>9</Concept_Ref>

<Concept_Ref>7</Concept_Ref>

</UpperCovers>

</Concept>

</Lattice>

</Galicia_Document>

Donc, comment je vais lire les valeurs déjà citées à partir de ce
fichier et comment je les mettre (dans des autres variables ou
directement je vais les utiliser) dans mon programme ?

S'il vous plaît, Pouvez-vous m'aider ?

Merci.
Avatar
Christian ASTOR
On 29 juil, 09:48, mah chab wrote:
On 26 juil, 17:01, Christian ASTOR wrote:

> RESULT hr = S_OK;
> IXMLDocument *pDoc = NULL;
> TCHAR szPath[MAX_PATH];
> lstrcpy(szPath, TEXT("test.xml"));
> hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVER,
> &IID_IXMLDocument, (void**)&pDoc);
> hr = pDoc->lpVtbl->put_URL(pDoc, szPath);
> // etc.. suivre la doc

Bonjour,

J'ai bien installé Libxml2 dans mon projet de travail. Il me reste
comment je vais l'utiliser dans mon programme C.



Mais tu le fais exprès ?!
Je viens de te donner le code pour parser avec les interfaces Windows.
Avatar
programmation
On 29 juil, 13:52, Christian ASTOR wrote:
On 29 juil, 09:48, mah chab wrote:

> On 26 juil, 17:01, Christian ASTOR wrote:

> > RESULT hr = S_OK;
> > IXMLDocument *pDoc = NULL;
> > TCHAR szPath[MAX_PATH];
> > lstrcpy(szPath, TEXT("test.xml"));
> > hr = CoCreateInstance(&CLSID_XMLDocument, NULL, CLSCTX_INPROC_SERVE R,
> > &IID_IXMLDocument, (void**)&pDoc);
> > hr = pDoc->lpVtbl->put_URL(pDoc, szPath);
> > // etc.. suivre la doc

> Bonjour,

> J'ai bien installé Libxml2 dans mon projet de travail. Il me reste
> comment je vais l'utiliser dans mon programme C.

Mais tu le fais exprès ?!
Je viens de te donner le code pour parser avec les interfaces Windows.




Salut,

MSXML est basée sur la méthode DOM. Or, DOM est adaptée au fichiers d e
taille petite de plus il y a la navigation dans l'arbre c'est vraie
c'est simple de chercher l'information par rapport à la méthode SAX.
Mais, le but de mon travail est de manipuler des fichiers de taille
grande. De plus, je m'intéresse au temps d'exécution qui je voulais le
moins possible.

Aussi, je ne vais pas modifier le fichier XML. Mais, je vais lire
seulement des informations entre les balises de ce fichier pour les
utiliser après dans mon programme C.
Pour cela, j'ai vu que la méthode SAX est plus convenable à mon
problème.

Je ne sais pas si MSXML implémente la méthoe SAX.

Quelle est votre proposition ?
Avatar
Christian ASTOR
On 29 juil, 16:49, programmation wrote:


Je ne sais pas si MSXML implémente la méthoe SAX.



Bien sûr, ça fait n fois qu'on poste la doc :
http://msdn.microsoft.com/en-us/library/ms762776(VS.85).aspx
même méthode que précédemment, en testant au départ de
CLSID_SAXXMLReader60 à CLSID_SAXXMLReader30au cas où l'on ait un
retour REGDB_E_CLASSNOTREG

(et "essai.lat.xml" n'est pas de "grande taille"...)
1 2