?
Hallo liebe Leute.
Kurz zu meiner Aufgabenstellung: Ich habe ein XML File dass ich als Konfigurationsspeicher benutze. Dieses XML File soll komplett dynamisch aufgebaut sein. Ich möchte also nodes in Structs einlesen können.
Mein Ansatz ist jetzt folgender: Verwenden tu ich DOM und hier lese ich mir die ersten Elemente aus, welche die Namen meiner Objekte sind. Die Parse ich und schreibe sie in ein Headerfile.
Von diesem Headerfile aus greife ich jetzt über eine weitere klasse auf die restlichen Childs zu. Das mache ich folgendermaßen:
main.cpp:
/*************************************************************************
*
*
* File < main.cpp > created <15.09.2010 > by muma
*
**************************************************************************/
//QT Includes
//Library Includes
//Application Includes
#include "xmldatalib.h"
#include "data_defines.h"
typedef struct __TEST_STRUCT__
{
int a;
}__attribute__((__packed__)) testStruct;
int main (int argc, char** argv)
{
XmlDataLib<testStruct> test("Object1","../include/data_defines.h");
return 0;
}
/****************************************************************************/
In data defines stehen jetzt die namen, was dann eigentlich statt dem Object1 hingehören würde (ein define).
Jetzt xmldatalib.h:
#ifndef __XMLDATALIB_H__
#define __XMLDATALIB_H__
/*************************************************************************
*
*
* File < xmldatalib.h > created <15.09.2010 > by muma
*
**************************************************************************/
//QT Includes
#include <QStringList>
#include <QDomDocument>
#include <QString>
#include <QFile>
//Library Includes
//Application Includes
class XmlRead
{
public:
XmlRead();
~XmlRead();
bool readTag(QString Name,QString Filename,QByteArray &data, QStringList &typeList)
{
if(Filename.isEmpty()||Name.isEmpty())
return false;
QFile xmlData(Filename);
QDomDocument objectDoc("objectType");
QString errMsg;
if(!objectDoc.setContent(&xmlData,&errMsg))
{
xmlData.close();
printf("***************couldn't set content for DOM!. Errmsg: <%s>***************\n",qPrintable(errMsg));
return false;
}
xmlData.close();
QDomNodeList nodes = objectDoc.elementsByTagName(Name);
for(int i =0;i<=nodes.size();i++)
{
QDomElement e = nodes.item(i).toElement();
// data = e.attribute("value","");
typeList.append(e.attribute("type",""));
data.append(e.attribute("value,"""));
}
};
private:
};
template <class T> class XmlDataLib
{
public:
XmlDataLib(QString name, QString Filename)
{
QByteArray dataFromTag;
QStringList typeList;
initData();
XmlRead getData;
if(!getData.readTag(name,Filename,dataFromTag,typeList))
printf("Autsch!");
int dataSize=0;
for(int i=0;i<=typeList.size();i++)
{
if(typeList[i]=="INT")
{
dataSize +=4;
}
else if(typeList[i]=="DOUBLE")
{
dataSize +=8;
}
else if(typeList[i]=="BOOL")
{
dataSize += 1;
}
}
// memcpy(m_Data,dataFromTag.constData(),dataSize);
m_Data=(T)dataFromTag.constData();
}
~XmlDataLib();
//Auf eingegebene Struktur zugreifen.
T& data()
{
return m_Data;
};
private:
void initData()
{
memset(&m_Data,0,sizeof(T));
}
T m_Data;
};
/****************************************************************************/
#endif
Die Fehlermeldung lautet:
./xmldatalib.h:95: error: no matching function for call to ‘__TEST_STRUCT__::__TEST_STRUCT__(const char*)’
src/main.cpp:20: note: candidates are: __TEST_STRUCT__::__TEST_STRUCT__(const __TEST_STRUCT__&)
src/main.cpp:20: note: __TEST_STRUCT__::__TEST_STRUCT__()
Ich benutze als compiler den GCC arbeite unter Ubuntu 9.10 und meine IDE ist Eclipse (und natürlich Qt aber dass sollte ja aus dem Code ersichtlich sein)
Danke