2009-05-08 21 views
9

Ich mag meine serverseitige Programmierung in C, aber muss mit einigem XML zusammenarbeiten.XML zu C struct und C struct zu XML

Was ich schreiben muss, ist eine Funktion, die bei einer C-Struktur oder einer verschachtelten Struktur und einer anderen Struktur (oder verschachtelten Strukturen), die die Elemente in der C-Struktur beschreibt, als XML ausgibt. Und eine andere Funktion, die das XML liest, überprüft, ob es mit der Beschreibung der C-Strukturen übereinstimmt und die C-Strukturen auffüllt.

Ich bin ziemlich sicher, dass dies schon viele Male zuvor getan wurde, aber es gibt so viele andere Informationen über XML da draußen, dass ich kein Glück habe, eine Google-Anfrage zu erstellen, die nicht viel anderes zurückgibt .

Ich bin nicht auf der Suche nach einer Bibliothek - nur ein paar hundert Zeilen C-Code zum Parsen der XML.

+2

Stimmen Sie zu, dass C nicht die richtige Wahl für eine komplett neue Webanwendung ist, aber was, wenn er eine gut etablierte Code-Basis hat? Wir haben nicht immer den Luxus, neu anzufangen, auch wenn der Neuanfang die Dinge auf lange Sicht erleichtern würde. – snowcrash09

+0

Weil mein Zeug manchmal auf die Titelseite von digg.com trifft, und ich bin nicht wirklich scharf darauf, viel für leistungsfähiges Hosting auszugeben. Es reduziert auch wirklich die Abhängigkeiten, was es gut macht, wenn jemand den Code lizenziert (was auch von Zeit zu Zeit passiert). Aber einverstanden - jedes Mal, wenn Sie malloc() viel anrufen, ist C nicht die richtige Sprache. Deshalb mache ich generell meine Strings fester Länge und vermeide malloc. –

+0

@JoshPetitt Es gibt definitiv Situationen, in denen C eine gute Wahl ist, aber das OP impliziert, dass er * nicht * gezwungen wird, C für dieses Projekt zu verwenden, indem er seine Frage mit "I * like *" für meine serverseitige Programmierung beginnt in C ", im Gegensatz zu" I * muss * C für dieses Projekt verwenden."Ich habe nicht versucht, einen Sprachkrieg zu beginnen, und ich hätte meinen ersten Kommentar weniger konfrontativ formulieren können. Tut mir leid, wenn es falsch gelaufen ist. –

Antwort

1

Ich denke, es gibt nicht wirklich etwas zur Verfügung, die ich verwenden kann, so schrieb ich einen einfachen XML-Parser in C. Es ist nur gut genug für meine Bedürfnisse, aber es ist auch nur 350 Zeilen C-Code.

+0

Schreiben eines XML-Parsers in C ??? Sehr seltsame Idee. Es gibt schon einige sehr gute. Siehe http://stackoverflow.com/questions/399704/xml-parser-for-c – bortzmeyer

+3

Ich war nicht bereit, viele Abhängigkeiten und Bibliotheken hinzuzufügen, die die Größe meines Projekts mehr als verdoppeln würden. –

1

Ein Weg, wie Sie es tun könnten, wenn Sie keine vorgefertigten Bibliotheken oder Code finden, ist eine toXML() - Funktion wie die üblichen toString() - Funktionen zu schreiben. Dann ein toStruct (char *), das das XML zurück in die Struktur deserialisiert

+1

Ja, etwas in der Art. Und das ist, was ich vermeiden möchte zu schreiben, wenn es Code gibt, der das tut. –

2

Sie werden nicht in der Lage sein, XML im allgemeinen Fall in nur ein paar hundert Zeilen Code zu analysieren. Es gibt mehrere XML-Parser-Bibliotheken, von denen expat in den Sinn kommt. Expat wurde in C geschrieben und hat eine C-freundliche API.

Die Serialisierung ist wahrscheinlich einfacher, wenn man davon ausgeht, dass die Datentypen, die sie unterstützen, nicht veraltet sind.

In beiden Fällen, wo dies Ihnen Kopfschmerzen verursacht, ist in der Aufrechterhaltung der Korrespondenz zwischen struct Layout und XML-Schema.

Vielleicht möchten Sie in Bibliotheken wie SCEW schauen, die den ereignisgesteuerten Charakter der Expat-Implementierung verbergen und etwas mehr wie einen DOM-Baum präsentieren wollen. Es gibt auch verschiedene Bibliotheken, die SOAP zusätzlich zu Expat implementieren, und diese müssen notwendigerweise mit dem Marshalling von Daten innerhalb und außerhalb von XML-Paketen umgehen.

+0

Nun, das XML analysieren ist der einfache Teil (und es gibt viele Bibliotheken, die einfacher sind als expat wie libxml) .Der schwierige Teil ist die Zwei-Wege-Mapping/Konvertierung zwischen C-Structs und XML. – bortzmeyer

+0

Gute Serialisierung ist immer schwieriger th Es sieht aus, egal was das zugrunde liegende Protokoll ist. IMHO, XML macht gute Serialisierung noch schwieriger zu tun, aber das ist nur aus meiner persönlichen Erfahrung. Ihre Laufleistung wird wahrscheinlich erheblich variieren. – RBerteig

+0

@RBertig, haben Sie irgendwelche Ressourcen für das Strukturlayout und das XML-Schema? Ich glaube, das ist der Kern der Frage (und meiner auch). Idealerweise suche ich nach der Teilmenge von XML, die immer einer C-Struktur und umgekehrt zugeordnet wird. Ich verstehe, dass das XML-Dokument und die C-Struktur grundlegend anders sind. Ich hoffe jedoch, eine gemeinsame Basis zwischen den beiden zu finden, die als Spezifikation verwendet werden könnte. –

3

Er fragt nicht nach einem XML-Parser. Er bittet um eine Bibliothek, die automatisch eine komplexe C-Struktur zu/von XML serialisiert/unserialisiert (was offensichtlich auf einem XML-Parser darunter beruht).

Libpdel ist alt, aber hat die Unterstützung für das, was Sie wollen (über die "Structs" Zeug).