2009-05-08 29 views
9

Mi piace fare la mia programmazione lato server in C, ma è necessario interagire con alcuni XML.XML to C struct e C struct to XML

Quello che devo scrivere è una funzione che, data una struttura C o una struttura nidificata, e un'altra struttura (o strutture nidificate) che descrive gli elementi nella struttura C, la sputa come XML. E un'altra funzione che legge l'XML, verifica che corrisponda alla descrizione delle strutture C e popola le strutture C.

Sono abbastanza certo che questo è stato fatto molte volte prima, ma ci sono così tante altre informazioni su XML là fuori che non ho alcuna fortuna a comporre una query di Google che non restituisce un sacco di cose non correlate .

Io non sto cercando una libreria - a poche centinaia di righe di codice C per analizzare il codice XML.

+2

concordano sul fatto che C non è la scelta giusta per una nuova applicazione web, ma se ha una base di codice ben definito? Non sempre abbiamo il lusso di ricominciare da capo, anche se ricominciare da capo renderebbe le cose più facili a lungo termine. – snowcrash09

+0

Perché a volte le mie cose colpiscono la prima pagina di siti come digg.com, e non sono molto interessato a spendere molto per l'hosting potente. Inoltre, riduce davvero molto le dipendenze, il che lo rende utile quando qualcuno esegue la licenza del codice (cosa che accade anche di volta in volta). Ma d'accordo - ogni volta che inizi a chiamare malloc() molto, C non è la lingua giusta. Questo è il motivo per cui in genere faccio stringere le corde in modo fisso ed evitare malloc. –

+0

@JoshPetitt Ci sono sicuramente situazioni in cui C è una grande scelta, ma l'OP ha implicato che non è * forzato * a usare C per questo progetto, iniziando la sua domanda con "I * like * per fare la mia programmazione lato server in C ", al contrario di" I * devo * usare C per questo progetto."Non stavo cercando di iniziare una guerra linguistica, e avrei potuto esprimere il mio primo commento in un modo meno conflittuale.Spiace se si è imbattuto nel modo sbagliato –

risposta

1

Immagino che non ci sia qualcosa di prontamente disponibile che io possa usare, così ho scritto un semplice parser XML in C.
È sufficiente solo per il mio bisogno, ma anche solo 350 righe di codice C.

+0

Scrittura di un parser XML in C ??? Un'idea molto strana. Ce ne sono già molti molto buoni. Vedi http://stackoverflow.com/questions/399704/xml-parser-for-c – bortzmeyer

+3

Non ero preparato a includere molte dipendenze e librerie che avrebbero raddoppiato le dimensioni del mio progetto. –

1

Un modo che si possa fare, se non trovate le librerie o codice predefiniti è quello di scrivere una funzione toxml() come il solito funzioni() toString. Quindi un toStruct (char *) che deserializza l'XML nella struct

+1

Sì, qualcosa del genere.E questo è quello che spero di evitare di dover scrivere se c'è del codice che lo fa. –

2

Non sarai in grado di analizzare XML nel caso generale in solo poche centinaia di righe di codice. Ci sono diverse librerie di parser XML là fuori, di cui mi viene in mente expat. Expat è stato scritto in C e ha un'API C-friendly.

serializzazione è probabile che sia più facile, a patto che non impazzire con i tipi di dati supportate.

In entrambi i casi, laddove ciò causerà il mal di testa nel mantenimento della corrispondenza tra il layout struct e lo schema XML.

Si potrebbe voler esaminare librerie come SCEW che mirano a nascondere la natura event-driven dell'implementazione di expat e presentare qualcosa di più simile a un albero DOM. Esistono anche varie librerie che implementano SOAP su expat e che necessariamente devono gestire il marshalling dei dati dentro e fuori i pacchetti XML.

+0

Beh, analizzando l'XML è la parte facile (e ci sono molte librerie che sono più facili di expat come libxml). La parte difficile è la mappatura/conversione bidirezionale tra le strutture C e XML. – bortzmeyer

+0

Una buona serializzazione è sempre più difficile a guarda, non importa quale sia il protocollo sottostante. IMHO, XML rende ancora più difficile fare una buona serializzazione, ma è solo dalla mia esperienza personale. Il tuo chilometraggio varierà, probabilmente considerevolmente. – RBerteig

+0

@RBerteig, si dispone di risorse per il layout della struttura e lo schema XML? Credo che questo sia il punto cruciale della domanda (e anche la mia). Idealmente sto cercando il sottoinsieme di XML che sarà sempre mappato a una struttura C e viceversa. Mi rendo conto che il documento XML e la struttura C sono fondamentalmente diversi. Tuttavia, spero di trovare un terreno comune tra i due che potrebbe essere usato come una specifica. –

3

Egli non chiede un parser XML. Sta chiedendo una libreria che serializzi/unserializes automaticamente una struttura C complessa da e verso XML (che ovviamente si baserebbe su un parser XML sottostante).

Libpdel è vecchio ma ha il supporto per fare ciò che si vuole (tramite la roba "le strutture").