通过宏定义来指定每个节点的名字:
Collapse
#define XML_ROOT "root" #define XML_FILE "file" #define XML_ID "id" #define XML_VER "version" #define XML_COUNT "count"
定义并实现两个类xml_handler、xml_parser。
xml_parser负责解析xml文件,但是它并不关心xml文件中的数据按什么样的格式保存。
而和具体的格式相关的类为xml_handler,解析xml文件后的数据会保存在这个类的实例里面。
回到顶部
xml_hanlder主要方法介绍
通过startElement和characters两个方法来获取数据:
virtual void startElement( const ACEXML_Char *namespaceURI,const ACEXML_Char *localName,255)">const ACEXML_Char *qName,ACEXML_Attributes *atts )
{
file节点
if(stricmp(localName,XML_FILE) == 0)
{
if(root_.count == files_.size())
{
return;
}
flag_ = FLAG_FILE;
ROOT_FILE* file = new ROOT_FILE();
files_.push_back(file);
for(int i=0; i<atts->getLength(); ++i)
{
const char* qname = atts->getQName(i);
if(stricmp(qname,XML_ID) == 0)
{
file->id = atoi(atts->getValue(i));
}
}
}
root节点
else 0)
{
flag_ = FLAG_ROOT;
0)
{
root_.version= atoi(atts->getValue(i));
}
0)
{
root_.count = atoi(atts->getValue(i));
}
}
}
}
void characters( const ACEXML_Char *ch,size_t start,size_t length )
{
if(flag_ == FLAG_FILE)
{
files_[files_.size() - 1]->path = ch;
}
flag_ = FLAG_NULL;
}
通过flush方法将root、file信息写入到xml文件中:
将当前root、file信息写入到xml文件中
bool flush() const
{
ofstream ofs(filepath_.c_str(),ios_base::trunc);
if(!ofs)
{
return false;
}
ofs << "<?xml version=\"1.0\"?>" << endl;
ofs << <" << XML_ROOT << " " << XML_VER << =\"" << root_.version << \" " << XML_COUNT << " << root_.count << \" >" << endl;
for(size_t i=0; i<files_.size(); ++i)
{
ofs << \t<" << XML_FILE << " << XML_ID << " << files_[i]->id << " << files_[i]->path << </>" << endl;
}
ofs << " << endl;
ofs.close();
true;
}
通过重载操作符operator[]方法获得子项的数据:
获取第index个ROOT_FILE子项
如果index超出当前子项的个数,则返回0
const ROOT_FILE* operator[](size_t index) const
{
if(index >= files_.size())
{
return 0;
}
return files_[index];
}