最近接触到tinyxml,觉得用它来读取和创建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>
#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; }