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:
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];
}
};
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.
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