// Structure pour représenter un élément de liste (vous pouvez la personnaliser)
structure typedef {
char *nom de l'élément ;
char *elementValue;
} ListElement ;
// Fonction pour convertir XML en liste d'éléments
ListElement* xmlToList(const char *xmlFilePath, int *listSize) {
xmlDoc *doc =xmlReadFile(xmlFilePath, NULL, 0);
si (doc ==NULL) {
fprintf(stderr, "Échec de l'analyse du fichier XML :%s\n", xmlFilePath);
renvoie NULL ;
}
xmlNode *root =xmlDocGetRootElement(doc);
si (racine ==NULL) {
fprintf(stderr, "Document XML vide\n");
xmlFreeDoc(doc);
renvoie NULL ;
}
// Traversée simple - s'adapte aux structures XML plus complexes
ListElement *liste =NULL ;
nombre entier =0 ;
xmlNode *cur =racine->enfants ;
while (cur !=NULL) {
if (cur->type ==XML_ELEMENT_NODE) {
compte++;
list =realloc(liste, nombre * sizeof(ListElement));
si (liste ==NULL) {
fprintf(stderr, "Échec de l'allocation de mémoire\n");
xmlFreeDoc(doc);
renvoie NULL ;
}
list[count-1].elementName =(char *)xmlGetProp(cur, (xmlChar *)"name"); //Exemple - obtenir l'attribut "name"
if (list[count-1].elementName ==NULL) list[count-1].elementName =(char*)cur->name;
list[count-1].elementValue =(char *)xmlNodeGetContent(cur);
}
cur =cur->suivant;
}
*listSize =nombre ;
xmlFreeDoc(doc);
liste de retour ;
}
int main() {
const char *xmlFilePath ="votre_fichier.xml"; // Remplacez par le chemin de votre fichier XML
int taille de liste ;
ListElement *myList =xmlToList(xmlFilePath, &listSize);
if (maListe !=NULL) {
printf("XML converti en liste :\n");
pour (int i =0; i
printf("Nom de l'élément :%s, Valeur :%s\n", maListe[i].elementName, maListe[i].elementValue);
xmlFree((xmlChar*)myList[i].elementName);
xmlFree((xmlChar*)myList[i].elementValue);
}
gratuit(maListe);
}
xmlCleanupParser();
renvoie 0 ;
}
```
4. Exemple `votre_fichier.xml` :
```xml
- C'est une pomme
- C'est une banane
- Cet élément n'a pas d'attribut de nom
```
Considérations importantes :
* Gestion des erreurs : Le code inclut une gestion des erreurs de base, mais vous devez ajouter des vérifications plus robustes pour les applications du monde réel.
* Gestion de la mémoire : Libxml2 utilise sa propre gestion de mémoire; assurez-vous de libérer la mémoire allouée en utilisant `xmlFreeDoc`, `xmlFree` et `free` lorsque vous avez terminé avec les données.
* Structure XML : Ce code suppose une structure XML simple. Pour un XML plus complexe, vous aurez besoin d'une approche plus sophistiquée, utilisant probablement des fonctions récursives pour parcourir l'arborescence XML. Vous devrez également gérer les attributs et les éléments imbriqués de manière appropriée.
* Représentation des données : La structure `ListElement` est très basique. Vous souhaiterez le modifier pour représenter les données réelles dont vous avez besoin à partir de votre fichier XML. Pensez à utiliser des structures de données plus adaptées telles que des listes chaînées ou des arbres pour les fichiers XML plus complexes.
N'oubliez pas de remplacer « votre_fichier.xml » par le chemin réel de votre fichier XML. Cet exemple amélioré vous donne une base plus solide pour travailler avec XML en C à l'aide de libxml2. Cependant, pour tout ce qui va au-delà des fichiers XML très simples, envisagez soigneusement d'utiliser une bibliothèque de traitement XML plus puissante, éventuellement dans un langage mieux adapté à cette tâche que C. (Python avec « xml.etree.ElementTree » ou des bibliothèques similaires sont souvent beaucoup plus simples.)