TinyXml 使用举例

/*********************************************************************************
 * 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;
}

你可能感兴趣的:(xml,测试,null,delete,System,任务)