现在的位置: 首页 > 综合 > 正文

tinyxml创建xml并读写

2018年10月16日 ⁄ 综合 ⁄ 共 4977字 ⁄ 字号 评论关闭

原文地址:http://gdizcm.blog.163.com/blog/static/952036612012759953915/ 

最近接触到tinyxml,觉得用它来读取和创建xml还是挺方便的。为了防止自己以后忘记怎么使用,便把它们记录下来。

创建的xml文件名为testxml.xml,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<BUSINESS ID="1" CODE="2" COUNT="num">
    <PLANET>地球</PLANET>
    <COUNTRY>中国</COUNTRY>
    <RYXX>
        <COMPANY>高科技公司</COMPANY>
        <DEPT>创新部门</DEPT>
        <GRXX>
            <NAME>一二三</NAME>
            <GENDER>男</GENDER>
            <PHONE>123456</PHONE>
        </GRXX>
        <GRXX>
            <NAME>四五六</NAME>
            <GENDER>男</GENDER>
            <PHONE>345678</PHONE>
        </GRXX>
    </RYXX>
</BUSINESS>

 

主文件名为testxml.cpp,内容如下:

#include <iostream>
#include "tinyxml.h"
#include "tinyxml.h"
#include "tinystr.h"
using namespace std;
void creatXml();
void readxml(TiXmlElement *node);
int main()
{
 creatXml();
 TiXmlDocument *myDocument = new TiXmlDocument("testxml.xml");    //打开一个xml文件
 myDocument->LoadFile();
 
 TiXmlElement *node = myDocument->FirstChildElement();      //返回当前节点的子节点
 if(node == NULL)               //若为空则返回
 {
  return 0;
 }

 readxml(node);        
 return 0;
}

void readxml(TiXmlElement *node)                     //读取xml文件
{
 while(node)             //如果节点存在
 {
  if(node->GetText()!=NULL)        //如果内容不为空则输出
  {
   cout<<node->Value()<<"="<<node->GetText()<<endl;
  }

  TiXmlAttribute *attri = node->FirstAttribute();   //获取节点的第一个属性,可以用LastAttribute()获取最后一个属性节点
  while(attri!=NULL)          //若属性不为空则输出
  {
   cout<<attri->Name()
    <<"="<<attri->Value()<<endl;
   attri=attri->Next();        //获取下一个属性节点
  }

  if(node->FirstChildElement() != NULL)     
  {
   readxml(node->FirstChildElement());    //若还有子节点,则进行递归调用
  }
  node=node->NextSiblingElement();
  if(!node)
  {
   break;
  }
 }
}

void creatXml()                             //创建xml文件
{
 TiXmlDocument *myDocument = new TiXmlDocument();        //创建一个根结点
 
 TiXmlDeclaration *pDeclaration=new TiXmlDeclaration("1.0","UTF-8","");   //创建xml文件头
 myDocument->LinkEndChild(pDeclaration);           //加入文件头
 
 TiXmlElement *BUSINESS=new TiXmlElement("BUSINESS");       //创建一个节点
 BUSINESS->SetAttribute("ID","1");             //创建节点的一个属性ID=1
 BUSINESS->SetAttribute("CODE","2");            //创建节点的另一个属性CODE=2
 BUSINESS->SetAttribute("COUNT","num");
 myDocument->LinkEndChild(BUSINESS);            //加入BUSINESS节点
 
 TiXmlElement *COUNTRY = new TiXmlElement("COUNTRY");       //创建两个节点
 TiXmlElement *PLANET = new TiXmlElement("PLANET");

    BUSINESS->LinkEndChild(PLANET);             //将新建的节点加到BUSINESS下一级
    BUSINESS->LinkEndChild(COUNTRY);
   
    TiXmlText *PLANETtxt = new TiXmlText("地球");          //添加节点内的文本
    TiXmlText *COUNTRYtxt = new TiXmlText("中国");
    COUNTRY->LinkEndChild(COUNTRYtxt);
    PLANET->LinkEndChild(PLANETtxt);
   
    TiXmlElement *RYXX = new TiXmlElement("RYXX");         
    BUSINESS->LinkEndChild(RYXX);              //通过LinkEndChild添加子节点
   
     TiXmlElement *COMPANY = new TiXmlElement("COMPANY");     
     RYXX->LinkEndChild(COMPANY);             //为RYXX节点添加子节点
     
     TiXmlText *COMPANYtxt = new TiXmlText("高科技公司");
     COMPANY->LinkEndChild(COMPANYtxt);            //为COMPANY节点添加文本
     
     TiXmlElement *DEPT = new TiXmlElement("DEPT");
     RYXX->LinkEndChild(DEPT);              //为RYXX节点添加子节点
     
     TiXmlText *DEPTtxt = new TiXmlText("创新部门");
     DEPT->LinkEndChild(DEPTtxt);             //为DEPT节点添加文本
 
  TiXmlElement *GRXX = new TiXmlElement("GRXX");
  RYXX->LinkEndChild(GRXX);              //为RYXX节点添加子节点
 
   TiXmlElement *NAME = new TiXmlElement("NAME");
   GRXX->LinkEndChild(NAME);             //为GRXX节点添加子节点
 
   TiXmlText *NAMEtxt = new TiXmlText("一二三");
   NAME->LinkEndChild(NAMEtxt);            //为NAME节点添加文本
  
   TiXmlElement *GENDER = new TiXmlElement("GENDER");
   TiXmlElement *PHONE = new TiXmlElement("PHONE");
   GRXX->LinkEndChild(GENDER);             //为GRXX节点添加子节点
   GRXX->LinkEndChild(PHONE);             //为GRXX节点添加子节点
 

   TiXmlText *GENDERtxt = new TiXmlText("男");
   TiXmlText *PHONEtxt = new TiXmlText("123456");
   GENDER->LinkEndChild(GENDERtxt);           //为GENDER节点添加文本
   PHONE->LinkEndChild(PHONEtxt);            //为PHONE节点添加文本
    
     TiXmlElement *GRXX1 = new TiXmlElement("GRXX");
     RYXX->LinkEndChild(GRXX1);              //为RYXX节点添加子节点
    
      TiXmlElement *NAME1 = new TiXmlElement("NAME");
      GRXX1->LinkEndChild(NAME1);             //为GRXX1节点添加子节点
    
      TiXmlText *NAME1txt = new TiXmlText("四五六");
      NAME1->LinkEndChild(NAME1txt);            //为NAME1节点添加文本
    
      TiXmlElement *GENDER1 = new TiXmlElement("GENDER");
      TiXmlElement *PHONE1 = new TiXmlElement("PHONE");
      GRXX1->LinkEndChild(GENDER1);            //为GRXX1节点添加子节点
      GRXX1->LinkEndChild(PHONE1);            //为GRXX1节点添加子节点
      
      TiXmlText *GENDER1txt = new TiXmlText("男");
      TiXmlText *PHONE1txt = new TiXmlText("345678");
      GENDER1->LinkEndChild(GENDER1txt);           //为GENDER1节点添加文本
      PHONE1->LinkEndChild(PHONE1txt);           //为PHONE1节点添加文本
      
      myDocument->SaveFile("testxml.xml");   //保存文件

/*如果要程序中还需要处理,可以保存到字符串中,将上面红字部分替换如下*/

/*

        char *psXML=NULL;     // 用来保存xml的字符串,可以放到函数参数里传递出去

        TiXmlPrinter printer;

        myDocument->Accept(&printer);

        memset(psXML,0x0,sizeof(psXML));

        memcpy(psXML,printer.CStr(),printer.Size());

*/
 delete myDocument;
 myDocument = NULL;
}

抱歉!评论已关闭.