原文地址: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;
}