• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] c und xml

SP

Member
Hallo,

ich möchte aus einem C-Programm heraus eine XML-Datei auslesen bzw. erzeugen. Habe das schonmal mit QXml gemacht, kann aber nicht davon ausgehen, dass Qt auf jedem Rechner installiert ist, auf dem das Programm laufen soll. Gibt es noch andere einfache Bibliotheken? Am besten wäre, wenn diese für Windows und Linux verfügbar wären.

Vielen Dank
SP
 
OP
S

SP

Member
Danke, ich werde mir die beiden mal ansehen. Es gibt keine Möglichkeit das mit den Standard-Funktionen zu lösen oder?
 
SP schrieb:
Es gibt keine Möglichkeit das mit den Standard-Funktionen zu lösen oder?
Du wirst keinen eigenen XML-Parser schreiben wollen, oder?

Link diejenige, für die Du dich entscheidest, doch einfach statisch ins Programm rein oder liefer sie zusammen mit dem Programm aus (wahrscheinlich nur für Windows nötig, auf fast allen Linux-Systemen sind sie bereits installiert).
 
OP
S

SP

Member
Ist es sehr kompliziert einen eigenen Parser zu schreiben?

Wie könnte man z. B. die libxml2 statisch verlinken?
 
OP
S

SP

Member
Dann beschäftige ich mich mal mit libxml2. Noch eine Frage: Gibt es dafür irgendwo eine Einführung oder so was? Auf xmlsoft.org wird zwar die API erklärt, aber da finde ich nicht, was ich suche.
 
OP
S

SP

Member
Ich habe jetzt einen ersten Versuch gemacht, ein einfaches Dokument mit nur einem Element zu erstellen und zu speichern. Allerdings bekomme ich beim Linken einen Fehler.

Code:
datenbank.o: In function `d_create':
datenbank.c:(.text+0x11d): undefined reference to `xmlSaveFileEnc'
collect2: ld gab 1 als Ende-Status zurück

Code:
int d_create(char* datenbank) {
	xmlDocPtr doc;
	xmlNodePtr node;

	doc = xmlParseFile(DATENBANK);
	if (doc != NULL) {
		printf("file %s exists\n", DATENBANK);
		xmlFreeDoc(doc);
		return 1;
	}

	doc = xmlNewDoc("1.0");
	node = xmlNewDocNode(doc, NULL, (const xmlChar*)"datenbank", NULL);
	xmlDocSetRootElement(doc, node);
	xmlSaveFileEnc(DATENBANK, doc, "ISO-8859-1");
	xmlFreeDoc(doc);

	return 0;
}

Kann mir jemand sagen, was da falsch ist?

Danke schonmal
SP
 
OP
S

SP

Member
Damit die Datei nicht erstellt wird, wenn sie schon existiert.

Mein Compileraufruf sieht so aus.

Code:
gcc -O2 -c datenbank.c
gcc -O2 -o datenbank `xml-config --libs --cflags` datenbank.o
 
OP
S

SP

Member
Habe den Fehler gefunden.

xml-config --cflags --libs gibt erstens als Include-Path /usr/include/gnome-xml und zweitens als zu linkende Library xml an und gehört zum Paket libxml.

libxml2 liefert xml2-config, das /usr/include/libxml2 als Include-Path und xml2 als Library angibt.
 
xml-config gehört zur veralteten libxml(1), xml2-config gehört zur libxml2. D.h. Du willst natürlich xml2-config benutzen.

Oder am besten gleich pkg-config nehmen:
Code:
gcc -O2 `pkg-config --cflags libxml-2.0` -c datenbank.c
gcc -O2 -o datenbank `pkg-config --cflags libxml-2.0` datenbank.o `pkg-config --libs libxml-2.0`
 
Oben