Linux 下读XML 的类详解及实现代码
Linux下读XML的类详解及实现代码
在Linux下写程序,常需要读一些配置文件。现有的XML工具很多,可以方便的编辑和生成XML。
但VC中用的XML解析器在Linux下不能用。只好自已写了个。用了一下,还不错。
#include#include //**********************************************************************// //XML解析类(honghaier写于2008-11-19) //**********************************************************************// structSXMLAttrib { charmKeyName[100];//键名 charmValue[100];//键值 } ; structSXMLFrame { public: charmFrameName[100];//帧名 intmAttrNum;//属性数量 SXMLAttrib*mAttrArray;//属性数组 SXMLFrame*mpSiblFrame;//兄弟结点 SXMLFrame*mpChiFrame;//子结点 SXMLFrame*mpParentFrame;//父结点 public: SXMLFrame(); ~SXMLFrame(); voidRelease_Depath(); SXMLFrame*GetFrame_Depth(char*szFrameName); intGetChildNum(); SXMLFrame*GetChildFrame(intIndex); SXMLFrame*GetChildFrame(char*szFrameName); SXMLFrame*GetSiblFrame(); SXMLFrame*GetParentFrame(); SXMLAttrib*GetAttrib(char*szKeyName); boolParseAttrString(char*szXMLString); } ; classCXMLFile { SXMLFramemRoot; SXMLFrame*mpCurrentFrame; boolmbDepthClose;//闭合 private: boolParseFrameString(char*szXMLString); public: intpFile; CXMLFile(); ~CXMLFile(); voidClose(); voidRelease(); boolOpen(constchar*pFileName); SXMLFrame*GetRoot(); SXMLFrame*GetFrame_Depth(char*szFrameName); } ; //==================================================== SXMLFrame::SXMLFrame() { memset(mFrameName,0,sizeof(mFrameName)); mAttrNum=0; mAttrArray=NULL; mpSiblFrame=NULL; mpChiFrame=NULL; mpParentFrame=NULL; } SXMLFrame::~SXMLFrame() { Release_Depath(); } voidSXMLFrame::Release_Depath() { if(mAttrNum>0) { if(mAttrArray) { delete[]mAttrArray; mAttrArray=NULL; } mAttrNum=0; } if(mpChiFrame) { mpChiFrame->Release_Depath(); deletempChiFrame; mpChiFrame=NULL; } if(mpSiblFrame) { mpSiblFrame->Release_Depath(); deletempSiblFrame; mpSiblFrame=NULL; } } SXMLFrame*SXMLFrame::GetFrame_Depth(char*szFrameName) { if(strcmp(mFrameName,szFrameName)==0) { returnthis; } if(mpChiFrame) { SXMLFrame*tResFrame=mpChiFrame->GetFrame_Depth(szFrameName); if(tResFrame)returntResFrame; } if(mpSiblFrame) { SXMLFrame*tResFrame=mpSiblFrame->GetFrame_Depth(szFrameName); if(tResFrame)returntResFrame; } returnNULL; } intSXMLFrame::GetChildNum() { intcount=0; for(SXMLFrame*temp=mpChiFrame;temp!=NULL;temp=temp->mpSiblFrame) { count++; } returncount; } SXMLFrame*SXMLFrame::GetChildFrame(intIndex) { intcount=0; for(SXMLFrame*temp=mpChiFrame;temp!=NULL;temp=temp->mpSiblFrame) { if(count==Index)returntemp; count++; } returnNULL; } SXMLFrame*SXMLFrame::GetChildFrame(char*szFrameName) { for(SXMLFrame*temp=mpChiFrame;temp!=NULL;temp=temp->mpSiblFrame) { if(strcmp(temp->mFrameName,szFrameName)==0) { returntemp; } } returnNULL; } SXMLFrame*SXMLFrame::GetSiblFrame() { returnmpSiblFrame; } SXMLFrame*SXMLFrame::GetParentFrame() { returnmpParentFrame; } SXMLAttrib*SXMLFrame::GetAttrib(char*szKeyName) { for(inti=0;i 0) { interror=close(pFile); if(error!=0) { perror("closefilefailed"); }else { pFile=-1; } Release(); } } voidCXMLFile::Release() { mRoot.Release_Depath(); } boolCXMLFile::Open(constchar*pFileName) { pFile=0; pFile=open(pFileName,O_RDONLY); if(pFile==-1) { perror(pFileName); returnfalse; } intnum=0; charbuffer; boolbReadXMLString=false; intXMLStringNum=0; charXMLString[1024]; while(num=read(pFile,&buffer,1)>0) { if(buffer=='<') { bReadXMLString=true; XMLStringNum=0; continue; } if(buffer=='>') { XMLString[XMLStringNum]='/0'; if(false==ParseFrameString(XMLString)) { printf("ReadXMLerror:%s/n",XMLString); returnfalse; } bReadXMLString=false; continue; } if(true==bReadXMLString) { XMLString[XMLStringNum++]=buffer; } } mpCurrentFrame=NULL; mbDepthClose=true; returntrue; } SXMLFrame*CXMLFile::GetRoot() { return&mRoot; } SXMLFrame*CXMLFile::GetFrame_Depth(char*szFrameName) { returnmRoot.GetFrame_Depth(szFrameName); } boolCXMLFile::ParseFrameString(char*szXMLString) { if(szXMLString[0]=='?')returntrue; if(szXMLString[0]=='!')returntrue; if(szXMLString[0]=='/') { //如果是结束 mpCurrentFrame=mpCurrentFrame->GetParentFrame(); mbDepthClose=true; } else { mbDepthClose=false; if(NULL==mpCurrentFrame) { mpCurrentFrame=&mRoot; } SXMLFrame*tNewFrame=newSXMLFrame; tNewFrame->ParseAttrString(szXMLString); if(false==mbDepthClose) { tNewFrame->mpParentFrame=mpCurrentFrame; if(NULL==mpCurrentFrame->mpChiFrame) { mpCurrentFrame->mpChiFrame=tNewFrame; } else { for(SXMLFrame*temp=mpCurrentFrame->mpChiFrame;temp!=NULL;temp=temp->mpSiblFrame) { if(NULL==temp->mpSiblFrame) { temp->mpSiblFrame=tNewFrame; break; } } } mpCurrentFrame=tNewFrame; } else { tNewFrame->mpParentFrame=mpCurrentFrame->GetParentFrame(); mpCurrentFrame->mpSiblFrame=tNewFrame; mpCurrentFrame=tNewFrame; } } returntrue; }
用XML工具做了一个简单的XML文件。
在C++代码中
可以这样使用
CXMLFilexmlfile; xmlfile.Open("1.xml"); SXMLFrame*mRootFrame=CXMLFile::GetRoot(); intChildNum=mRootFrame->GetChildNum(); for(inti=0;iGetChildFrame(i); SXMLAttrib*tAttrib=tChileFrame->GetAttrib("Age"); print("%s:%s=%s/n",mChileFrame->mFrameName,tAttrib->mKeyName,tAttrib->mValue); }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!