Ciao.
Spero di non annoiarvi se spiego un po quello che sto cercando di fare , magari(mi piacerebbe) questa discussione potrebbe servire a qualcun altro.
Ho dei documenti xml che possono essere i diverse centinaia di mega e devo effettuare il parsing per importare solo determinati dati che saranno 1/4 dell' xml , esistono infatti molti tag che non mi interessano per niente , almeno per adesso , e quindi posso tralasciarli .
Per questo ho scelto SAX come motore di parsing di quest importatore.
Il documento xml è formato da un insieme di tag che hanno un id=xxx e un insieme di tag che anno un ref = xxx.
I tag ref rimandano a i tag id che conservano al loro interno un insieme di dati particolari.
/////////////IMPLEMENTAZIONE
Io ho creato una classe per tutti i tag che hanno un ID=xxx e per tutti i tag che hanno un REF=xxx e ho fatto derivare queste classi da una classe base CEntityBase.
per ogni classe id e ref ho un array con il tipo in formato testo della classe (anche nome del tax xml), un array di campi che mi interessano (sempre in formato testo) e gli stessi valori implementati come proprietà della classe.
La proprietà col tipo mi serve per il parsing SAX , infatti testo per ogni start tag di sax che sia uguale alla mia proprietà tipo e se si attivo faccio la stessa cosa con gli attributi e i sottonodi
di quella che è definita come classe in xml.
Quando trovo corrispondenza di valori tra le stringhe nelle classi xml e quelle dell' xml leggo i valori e creo l'oggetto c++ con i dati recuperati .
infine inserisco in una mappa del tipo:
map<string,map<string,classe> >
nel primo campo l'id testuale del tipo , e nella seconda mappa l'id testuale prelevato dall'xml(id=xxx) e infine l'oggetto.
alla fine vorrei essere in grado di avere una mappa per gli id accessibile cosi:
CEntityBase elemento = map[TIPO][ID]
e una mappa per i ref cosi:
CEntityBase elemento = map[TIPO][REF]
E' possibile questo con le map dell stl?
Il problema è che cosi mi sembra molto confusionaria la mia mappa , non ho infatti nessun aiuto per navigare le proprieta.
Pensavo di fare una cosa del genere :
passare agli oggetti id e ref il puntatore alle istanze dellle due mappe , in modo da poter gestire meglio e in modo piu' ordinato cosi:
col puntatore alle mappe che puo essere della mappa ref o della mappa id ho cercato di creare delle funzioni(la funzione getRefOwnerHistory() nell esempio)che mi ritorna un tipo non base , ma il tipo reale che c'è a quell'indice nella mappa cosi da essere un po piu' ordinato e un po piu' chiaro per uno che lo deve modificare.codice:la classe base class CBaseEntityIfc { public: CBaseEntityIfc(void); virtual ~CBaseEntityIfc(void); virtual string CBaseEntityIfc::getID(); virtual string CBaseEntityIfc::getType(){return "IfcBase";}; virtual string CBaseEntityIfc::setID(string strId){m_strId = strId;}; virtual string CBaseEntityIfc::setType(string strType){m_strType = strType;}; protected: //l'id e il tipo sono comuni a tutte le classi IFC per questo le //implemento nella classe base string m_strId; string m_strType; }; e le classi derivate: class CIfcProject : public CBaseEntityIfc { public: CIfcProject(void); virtual ~CIfcProject(void); map<string, CBaseEntityIfc>* pMap; CIfcOwnerHistory* getRefOwnerHistory() { pMap[this->gettype()][m_strREF]; } };
altrimenti se non si conoscono i tipi e non si ha la specifica sotto mano non si capisce niente solo con indici testuali , invece se riuscissi a farlo funzionare potrei avere una cosa del tipo:
strData1 =IFCProject->getRefOwnerHistory()->getData1() ecc.....
Vorrei trovare un modo un po piu' ordinato ma nonsono riuscito a pensarlo , mentre per la velocità dovrebbe essere abbastanza veloce (credo) in confronto al DOM.
Scusate se mi sono espresso male o se è uno dei miei soliti voli pindarici.
ciao![]()

Rispondi quotando