// Struktur för att representera ett listelement (du kan anpassa detta)
typedef struct {
char *elementName;
Char *ElementValue;
} ListElement;
// Funktion för att konvertera XML till en lista över element
ListElement *xmltolist (const char *xmlFilepath, int *listar size) {
xmldoc *doc =xmlreadfile (xmlFilePath, null, 0);
if (doc ==null) {
fprintf (stderr, "misslyckades med att analysera xml -fil:%s \ n", xmlfilepath);
returnera null;
}
xmlnode *root =XMLDOCGETROOTELEMENT (DOC);
if (root ==null) {
fprintf (stderr, "tom XML -dokument \ n");
xmlfreedoc (doc);
returnera null;
}
// Simple Traversal - Anpassa för mer komplexa XML -strukturer
ListElement *List =null;
int count =0;
xmlnode *cur =root-> barn;
medan (cur! =null) {
if (cur-> typ ==xml_element_node) {
Räkna ++;
List =RealLoc (lista, räkning * SIZEOF (ListElement));
if (list ==null) {
fprintf (Stderr, "Memory Allocation Failed \ n");
xmlfreedoc (doc);
returnera null;
}
Lista [count-1] .ElementName =(char *) xmlgetProp (cur, (xmlchar *) "namn"); // Exempel - Få "Namn" -attribut
if (lista [count-1] .ElementName ==NULL) -lista [Count-1] .ElementName =(char*) cur-> name;
Lista [Count-1] .ElementValue =(char *) XmlnodeGetContent (cur);
}
cur =cur-> nästa;
}
*listar storlek =räkning;
xmlfreedoc (doc);
returlista;
}
int main () {
const char *xmlFilePath ="your_file.xml"; // Byt ut med din XML -filväg
int listar size;
ListElement *mylist =xmltolist (xmlFilePath, &listar size);
if (myList! =null) {
printf ("XML konverterad till lista:\ n");
för (int i =0; i
printf ("Elementnamn:%s, värde:%s \ n", myList [i] .ElementName, MyList [i] .ElementValue);
xmlfree ((xmlchar*) mylist [i] .elementName);
xmlfree ((xmlchar*) mylist [i] .elementValue);
}
gratis (mylist);
}
xmlcleanUpparser ();
return 0;
}
`` `
4. `` your_file.xml` exempel:
`` `xml
Detta är ett Apple
- Detta är en banan
Det här objektet har inget namnattribut
`` `
Viktiga överväganden:
* Felhantering: Koden innehåller grundläggande felhantering, men du bör lägga till mer robusta kontroller för verkliga applikationer.
* Minneshantering: Libxml2 använder sin egen minneshantering; Se till att du frigör det tilldelade minnet med `xmlfreedoc`,` xmlfree` och `gratis 'när du är klar med data.
* XML -struktur: Denna kod antar en enkel XML -struktur. För mer komplex XML behöver du ett mer sofistikerat tillvägagångssätt, sannolikt att använda rekursiva funktioner för att korsa XML -trädet. Du måste också hantera attribut och kapslade element på lämpligt sätt.
* Datarepresentation: "ListElement" -strukturen är mycket grundläggande. Du vill ändra den för att representera de faktiska data du behöver från din XML -fil. Överväg att använda mer lämpliga datastrukturer som länkade listor eller träd för mer komplexa XML -filer.
Kom ihåg att ersätta `" your_file.xml "` med den faktiska sökvägen till din XML -fil. Detta förbättrade exempel ger dig en mer solid grund för att arbeta med XML i C med hjälp av libxml2. Men för allt utöver mycket enkla XML -filer kan du noggrant överväga att använda ett mer kraftfullt XML -bearbetningsbibliotek, eventuellt på ett språk som är bättre lämpat för denna uppgift än C. (python med `xml.etree.ElementTree` eller liknande bibliotek är ofta mycket enklare.)