Chinaunix首页 | 论坛 | 博客
  • 博客访问: 176110
  • 博文数量: 24
  • 博客积分: 1116
  • 博客等级: 少尉
  • 技术积分: 342
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-20 19:15
文章分类

全部博文(24)

文章存档

2011年(20)

2010年(4)

我的朋友

分类: C/C++

2011-03-21 18:34:25

对于TinyXml这个工具,很久以前就使用过了,但是一直没抽出时间来记录下它的使用方法。孔子曰:温故而知新,可以为师矣。圣人的话总不会有错的,所以把原来做的项目代码翻出来记录下,供以后查看!
假设对于一个XML文档 a.xml


//加载XML文件 生成一个DOM树,返回TiXmlDocument对象

TiXmlDocument* par***ml::loadxmlfile(const char *path)
{

    TiXmlDocument *my_document = new TiXmlDocument();
    if(path)
    {
        bool res = my_document->LoadFile(path);
        if(!res)
        {
             my_document->Clear();
            res = my_document->LoadFile(path);
            if(!res)
            {
                my_document->Clear();
                if(path != NULL)
                {
                remove(path);
                printf("remove the file %s\n",path)
                }

                return NULL;
            }
        }
    }
    return my_document;
}


树已生成,经过上面的加载,就可以用返回的my_document对整个树进行相应的操作。加载树的目的,肯定是想从树中提取你想要的信息,再达成这个目的以前,需要对你感兴趣的数据在树中的位置进行定位,也就是遍历到你需要的节点上。



TiXmlElement* par***ml::findelement(const char *name, TiXmlElement *parent)
{
    TiXmlElement *elem = NULL;

    if(name == NULL || parent == NULL)
    {
        return NULL;
    }

    if(strcmp(name,parent->Value()) == 0)
    {
        return parent;
    }
    for(elem = parent->FirstChildElement(); elem;elem = elem->NextSiblingElement())
    {
        TiXmlElement *temp = NULL;
        temp = findelement(name,elem);
        if(temp)
        {
            return (TiXmlElement*)temp;
        }
    }
    return NULL;
}


这是个递归调用,参数name代表树节点,例如<姓名>张三,这里的姓名就是name了,parent代表父节点,也就是开始查找的节点。经过递归调用可以定位到你所需要的节点,剩下的就是取值了。

取值:

               TiXmlElement *temp = findelement("title",elem);
               if(temp == NULL)
               {
                   elem = elem->NextSiblingElement();
                   continue;
               }
               memset(tempbuf,0,BUFLEN);
               g2u((char*)temp->GetText(),strlen(temp->GetText()),tempbuf,2*strlen(temp->GetText()));
               strncpy(item->title,tempbuf,strlen(tempbuf))


取属性值:

void par***ml::traversalopml(TiXmlElement *elem)
{
    int i = 0;
    OPML* temp;

    temp = myopml;

    TiXmlAttribute *att = elem->FirstAttribute();

    TiXmlElement *tx = findelement("outline",elem->FirstChildElement());


    while(tx != NULL)
    {
        att = tx->FirstAttribute();

        do
        {
           if(strcmp(att->Name(),"text") == 0)
           {
               strcpy(temp->title,att->Value());;
           }
           else if(strcmp(att->Name(),"type") == 0)
           {
               strcpy(temp->type,att->Value());
           }
           else if(strcmp(att->Name(),"xmlUrl") == 0)
           {
               strcpy(temp->xml_url,att->Value());
               printf("opml url:%s\n",temp->xml_url);
           }

        }while((att = att->Next()) != NULL);

        temp->id = i;
        OPML *op = new OPML();
        temp->next = op;
        temp = op;
        i++;

        tx = tx->NextSiblingElement();

    }
}


OK 大体上来说 就是那么简单!!

阅读(1452) | 评论(0) | 转发(0) |
0

上一篇:linux回调函数

下一篇:SIP RFC中文文档1

给主人留下些什么吧!~~