/********************************************************************************* * author: hjjdebug * date: 2011 * tinyxml, 有2个.h 文件, 4个cpp 文件。 * 对TinyXml 的理解,最好的办法是阅读代码 * xml 是一种层次状结构。xml可以用树内存结构描述。 * TinyXml 有几个重要概念。TinyXmlNode, TinyXmlElement, TinyXmlText, TinyXmlDocmnet * 简述如下: * TinyXmlDocmnet 是由TinyXmlNode 构成的树 * TinyXmlElement 继承自TinyXmlNode 并有私有变量TinyXmlAttribute , * 属性可以例如pElement->SetAttribute("ID", "1") 设置ID=1 属性 * TinyXmlText 继承自TinyXmlNode 有自己的新接口函数 * 封装TinyXmlText TinyXmlElement 是为了更好的访问和控制TinyXmlNode 类。 * 整个TinyXml 构造核心是一个树。 更深的理解请阅读源码。 * 对xml 的使用就是建造一个个 元素, 或者阅读一个个元素, 元素是按层次构造的。 * 时刻注意元素(或者结点)的值, 注意元素和元素的关系 * 后面给出几个实例供参考,帮助使用和理解概念。 *********************************************************************************/ #include <windows.h> #include <vector> #include "tinyxml.h" #include "tinystr.h" #include <iostream> using namespace std; #pragma warning(disable:4996) typedef struct tagClipInfo { int taskID; vector<int> vecClipNo; string targetName; }ClipInfo; char *xmlstr="/ <root>/ <taskid>15</taskid>/ <clips>/ <clip>1</clip>/ <clip>2</clip>/ <clip>3</clip>/ <clip>4</clip>/ <clip>5</clip>/ </clips>/ <output>/cbs/taskid/product/test.pcm</output>/ </root>/ "; /* 什么叫一个clip? 一个clip 就是包含了一个开始pts(可表示为videopts) 和一个结束pts(可表示为videopts )的结构 但这里的clip 仅仅是一个clip 的ID. ---------------------------------- input: xmlstr output: clipInfo ---------------------------------- */ bool ReadClipInfo(ClipInfo &clipInfo,char *xmlstr ) { TiXmlDocument *pDoc = new TiXmlDocument(); pDoc->Parse(xmlstr); // pDoc->LoadFile(xmlFileName); TiXmlElement *root = pDoc->RootElement(); if(!root) return false; TiXmlElement *taskidEle = root->FirstChildElement(); clipInfo.taskID = strtoul(taskidEle->GetText(),NULL,10); TiXmlElement *clips = taskidEle->NextSiblingElement(); TiXmlElement *clip = clips->FirstChildElement(); while(clip) { int id=strtoul(clip->GetText(),NULL,10); clipInfo.vecClipNo.push_back(id); clip = clip->NextSiblingElement(); } TiXmlElement *output = clips->NextSiblingElement(); clipInfo.targetName = output->GetText(); return true; } /* <root> <taskid>200</taskid>//录制任务ID <channel>15</channel> //频道ID <stoptime>2011-1-13 09:00:00</stoptime> //录制任务结束时间 </root> */ BOOL ReadXMLInfo(char *filename, int *taskID, int *channel, SYSTEMTIME &stopTime) { char szStopTime[256]; TiXmlDocument* pDoc = new TiXmlDocument(); // pDoc->Parse(xmlString); pDoc->LoadFile(filename); TiXmlElement* root = pDoc->RootElement(); if(root==NULL) return false; TiXmlElement* pElement = root->FirstChildElement(); while(pElement) { if(strcmp(pElement->Value(),"taskid")==0) *taskID=strtoul(pElement->GetText(),NULL,10); else if(strcmp(pElement->Value(),"channel")==0) *channel=strtoul(pElement->GetText(),NULL,10); else if(strcmp(pElement->Value(),"stoptime")==0) { strcpy(szStopTime,pElement->GetText()); sscanf(szStopTime,"%d-%d-%d %d:%d:%d",&stopTime.wYear,&stopTime.wMonth,&stopTime.wDay, &stopTime.wHour,&stopTime.wMinute,&stopTime.wSecond); } pElement = pElement->NextSiblingElement(); } delete(pDoc); if(stopTime.wYear == 0) { cout << "error xml format, time is 0" <<endl; system("pause"); return FALSE; } return TRUE; } /* 将该信息存储到filename <root> <taskid>200</taskid>//录制任务ID <channel>15</channel> //频道ID <stoptime>2011-1-13 09:00:00</stoptime> //录制任务结束时间 </root> */ void WriteXmlFile(char *filename) { TiXmlDocument * pDoc = new TiXmlDocument(); TiXmlElement *root = new TiXmlElement("root"); TiXmlElement *taskid = new TiXmlElement("taskid"); TiXmlElement *channel = new TiXmlElement("channel"); TiXmlElement *stoptime = new TiXmlElement("stoptime"); TiXmlText *t_taskid = new TiXmlText("200"); taskid->LinkEndChild(t_taskid); TiXmlText *t_channel = new TiXmlText("15"); channel->LinkEndChild(t_channel); TiXmlText *t_stoptime = new TiXmlText("2011-1-13 09:00:00"); stoptime->LinkEndChild(t_stoptime); pDoc->LinkEndChild(root); root->LinkEndChild(taskid); root->LinkEndChild(channel); root->LinkEndChild(stoptime); pDoc->SaveFile(filename); delete(pDoc); } int main(int argc, char *argv[]) { //测试读clipinfo ClipInfo cInfo; ReadClipInfo(cInfo, xmlstr); cout << cInfo.targetName.c_str() << endl; cout << cInfo.taskID << endl; for(int i=0; i<sizeof(cInfo.vecClipNo.size()); i++) { cout << cInfo.vecClipNo[i]<<endl; } //测试生成一个xml字符串并写文件。 WriteXmlFile("test.xml"); //测试读录制任务 int taskID, channel; SYSTEMTIME time; ReadXMLInfo("test.xml", &taskID, &channel, time); cout << "taskID = " << taskID <<endl; cout << "channel = " << channel << endl; cout << "time stucture:" << endl; cout << "Year: "<<time.wYear << endl; cout << "Month: " << time.wMonth << endl; system("pause"); return 0; }