TinyXML之初体验

      前一阵子做一个客服回复玩家问题工具,要用到读写XML文件的数据,同事推荐用TinyXML,于是,开始了我与TinyXML的亲密之旅。

      先简单说说配置:首先下载TinyXML库的文件,然后在 TinyXML 的目录里面找到tinystr.h, tinyxml.h,tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp,tinyxmlparser.cpp六个文件加入到自己的项目中去,在相应的工程文件中加入两个头文件 #include "tinyxml.h"   ,#include "tinystr.h",在 tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp四个文件的第一行加入头文件 #include "stdafx.h",然后即可使用TinyXML编程。

=======================================================

        要读取的xml 数据如下:

        <?xml version="1.0" encoding="gb2312" standalone="yes" ?>
        <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

               <prop>   

                       <id>100</id>

                       <title> test 1</title>

               </prop>

               <prop>   

                       <id>200</id>

                       <title> test 2</title>

               </prop>

        </root>

      注意要将 encoding设为gb2312格式,我一开始设置的是utf-8,结果遇到在程序里

      写入中文没问题, 但在读出该中文时却有异常,把后面的 </   符号也当作值读出来

      了,后来和一同事讨论后才知道是编码问题。

=======================================================

      string   filefullPath = 要读取xml文件的绝对路径

      //创建文件对象

      TiXmlDocument *  myDocument = new TiXmlDocument(filefullPath.c_str());

      //加载文件数据
      myDocument->LoadFile();
 
      //获取根节点
      TiXmlElement *RootElement = myDocument->RootElement();

=======================================================

     以下是简单的读取操作:

    //第一个子节点
    TiXmlElement *CurrentPerson = RootElement->FirstChildElement();
 
    //遍历获取指定节点数据
    while(CurrentPerson)
    { 

         //子节点第一个属性  id
         TiXmlElement *IdElement = CurrentPerson->FirstChildElement();

         //第一个属性的值
         int  nodeID = atoi(IdElement->FirstChild()->Value());

         //子节点第二个属性  title
         TiXmlElement *TitleElement = IdElement->NextSiblingElement();

         //第二个属性的值
         CString   nodeTitle = TitleElement->FirstChild()->Value();

         .....................

         如果还有后续属性,依次读取

         .....................

         维护读出的数据

         .....................

         //指向下一节点
         CurrentPerson = CurrentPerson->NextSiblingElement();
    }
=======================================================

     以下是增加xml记录的操作,例如要增加 id 为 300,title 为 test3 的记录:

     //创建节点对象
     TiXmlElement *PersonElement = new TiXmlElement("prop");

     //链接到根节点
     RootElement ->LinkEndChild(PersonElement);

     //创建节点对象的属性节点
     TiXmlElement *IdElement = new TiXmlElement("id");
     TiXmlElement *TitleElement =new TiXmlElement("title");

     //将属性节点链接到子节点
     PersonElement->LinkEndChild(IdElement);
     PersonElement->LinkEndChild(TitleElement);

     //创建属性对应数值对象

     TiXmlText *idContent = new TiXmlText("300");

     TiXmlText *titleContent = new TiXmlText("test3");

     //将数值对象关联到属性节点
     IdElement->LinkEndChild(idContent);
     TitleElement->LinkEndChild(titleContent);

     //保存到文件
     myDocument->SaveFile(m_filefullPath.c_str());

=======================================================

     以下是删除记录操作,例如要删除id为300 的记录:

     //获取当前要删除的节点
     TiXmlElement * childElement = 根据id从自己读取时缓存的数据中获得

     //从根节点移除子节点
     RootElement->RemoveChild(childElement);

     //保存文件
     myDocument->SaveFile(m_filefullPath.c_str());

=======================================================

     学习TinyXML主要是要理解其节点的层次关系,通晓其筋脉,则运用自如。

posted @ 2011-11-08 01:15  毛志谦  阅读(3132)  评论(1编辑  收藏  举报