Linux 下读XML 的类详解及实现代码

在Linux下写程序,常需要读一些配置文件。现有的XML工具很多,可以方便的编辑和生成XML。
但VC中用的XML解析器在Linux下不能用。只好自已写了个。用了一下,还不错。
#include <stdio.h>
#include <stdlib.h>
// ********************************************************************** //
// XML解析类(honghaier写于2008-11-19)
// ********************************************************************** //
struct SXMLAttrib
{
char mKeyName[100]; //键名
char mValue[100]; //键值
}
;
struct SXMLFrame
{
public:
char mFrameName[100]; //帧名
int mAttrNum; //属性数量
SXMLAttrib* mAttrArray; //属性数组
SXMLFrame* mpSiblFrame; //兄弟结点
SXMLFrame* mpChiFrame; //子结点
SXMLFrame* mpParentFrame; //父结点
public:
SXMLFrame();
~SXMLFrame();
void Release_Depath();
SXMLFrame* GetFrame_Depth(char *szFrameName);
int GetChildNum();
SXMLFrame* GetChildFrame(int Index);
SXMLFrame* GetChildFrame(char *szFrameName);
SXMLFrame* GetSiblFrame();
SXMLFrame* GetParentFrame();
SXMLAttrib* GetAttrib(char *szKeyName);
bool ParseAttrString(char *szXMLString);
}
;
class CXMLFile
{
SXMLFrame mRoot;
SXMLFrame* mpCurrentFrame;
bool mbDepthClose; //闭合
private:
bool ParseFrameString(char *szXMLString);
public:
int pFile;
CXMLFile();
~CXMLFile();
void Close();
void Release();
bool Open( const char * 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();
}
void SXMLFrame::Release_Depath()
{
if(mAttrNum > 0)
{
if(mAttrArray)
{
delete[] mAttrArray;
mAttrArray = NULL;
}
mAttrNum = 0;
}
if(mpChiFrame)
{
mpChiFrame->Release_Depath();
delete mpChiFrame;
mpChiFrame = NULL;
}
if(mpSiblFrame)
{
mpSiblFrame->Release_Depath();
delete mpSiblFrame;
mpSiblFrame = NULL;
}
}
SXMLFrame* SXMLFrame::GetFrame_Depth(char *szFrameName)
{
if(strcmp(mFrameName,szFrameName)==0)
{
return this;
}
if(mpChiFrame)
{
SXMLFrame* tResFrame = mpChiFrame->GetFrame_Depth(szFrameName);
if(tResFrame)return tResFrame;
}
if(mpSiblFrame)
{
SXMLFrame* tResFrame = mpSiblFrame->GetFrame_Depth(szFrameName);
if(tResFrame)return tResFrame;
}
return NULL;
}
int SXMLFrame::GetChildNum()
{
int count = 0;
for(SXMLFrame *temp = mpChiFrame ; temp != NULL ;temp = temp->mpSiblFrame)
{
count++;
}
return count;
}
SXMLFrame* SXMLFrame::GetChildFrame(int Index)
{
int count = 0;
for(SXMLFrame *temp = mpChiFrame ; temp != NULL ;temp = temp->mpSiblFrame)
{
if(count == Index)return temp;
count++;
}
return NULL;
}
SXMLFrame* SXMLFrame::GetChildFrame(char *szFrameName)
{
for(SXMLFrame *temp = mpChiFrame ; temp != NULL ;temp = temp->mpSiblFrame)
{
if(strcmp(temp->mFrameName,szFrameName)==0)
{
return temp;
}
}
return NULL;
}
SXMLFrame* SXMLFrame::GetSiblFrame()
{
return mpSiblFrame;
}
SXMLFrame* SXMLFrame::GetParentFrame()
{
return mpParentFrame;
}
SXMLAttrib* SXMLFrame::GetAttrib(char *szKeyName)
{
for(int i = 0 ; i < mAttrNum ; i++)
{
if(strcmp(mAttrArray[i].mKeyName,szKeyName)==0)
{
return &mAttrArray[i];
}
}
return NULL;
}
bool SXMLFrame::ParseAttrString(char *szXMLString)
{
SXMLAttrib AttribArray[100];
int len = strlen(szXMLString);
mAttrNum = 0;
int StrPos = 0;
bool HaveFrameName = false;
for(int i = 0 ;i < len ; i++)
{
if(i==(len-1))
{
if(false == HaveFrameName)
{
memcpy(mFrameName,szXMLString,len);
mFrameName[len]='/0';
HaveFrameName = true;
}
else
{
if(( len - StrPos-1 )== 0)
{
memset(AttribArray[mAttrNum].mValue,0,sizeof(AttribArray[mAttrNum].mValue));
}
else
{
memcpy(AttribArray[mAttrNum].mValue,szXMLString+StrPos,len-StrPos-1);
AttribArray[mAttrNum].mValue[len-StrPos-1]='/0';
}
mAttrNum++;
StrPos = 0;
}
break;
}
if(szXMLString[i] == ' '&&szXMLString[i-1] == ' ')
{
StrPos = i+1;
continue;
}
if(szXMLString[i] == ' ')
{
if(false == HaveFrameName)
{
memcpy(mFrameName,szXMLString,i);
mFrameName[i]='/0';
HaveFrameName = true;
StrPos = i+1;
continue;
}
else
{
if(( i - StrPos-1 )== 0)
{
memset(AttribArray[mAttrNum].mValue,0,sizeof(AttribArray[mAttrNum].mValue));
}
else
{
memcpy(AttribArray[mAttrNum].mValue,szXMLString+StrPos,i-StrPos-1);
AttribArray[mAttrNum].mValue[i-StrPos-1]='/0';
}
mAttrNum++;
StrPos = i+1;
continue;
}
}
if(szXMLString[i] == '=')
{
memcpy(AttribArray[mAttrNum].mKeyName,szXMLString+StrPos,i-StrPos);
AttribArray[mAttrNum].mKeyName[i-StrPos]='/0';
i++;//跳过一个"""
StrPos = i+1;
continue;
}
}
mAttrArray = new SXMLAttrib[mAttrNum];
if(!mAttrArray)return false;
memcpy(mAttrArray,AttribArray,mAttrNum*sizeof(SXMLAttrib));
return true;
}
CXMLFile::CXMLFile()
{
pFile = 0;
mpCurrentFrame = NULL;
mbDepthClose = false;
}
CXMLFile::~CXMLFile()
{
Close();
}
void CXMLFile::Close()
{
if( pFile>0)
{
int error = close( pFile);
if( error!=0)
{
perror("close file failed");
}else
{
pFile=-1;
}
Release();
}
}
void CXMLFile::Release()
{
mRoot.Release_Depath();
}
bool CXMLFile::Open( const char * pFileName)
{
pFile =0;
pFile = open( pFileName,O_RDONLY);
if( pFile==-1)
{
perror(pFileName);
return false;
}
int num = 0;
char buffer;
bool bReadXMLString = false;
int XMLStringNum = 0;
char XMLString[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("Read XML error: %s /n",XMLString);
return false;
}
bReadXMLString = false;
continue;
}
if(true == bReadXMLString)
{
XMLString[XMLStringNum++] = buffer;
}
}
mpCurrentFrame = NULL;
mbDepthClose = true;
return true;
}
SXMLFrame* CXMLFile::GetRoot()
{
return &mRoot;
}
SXMLFrame* CXMLFile::GetFrame_Depth(char *szFrameName)
{
return mRoot.GetFrame_Depth(szFrameName);
}
bool CXMLFile::ParseFrameString(char *szXMLString)
{
if(szXMLString[0] == '?')return true;
if(szXMLString[0] == '!')return true;
if(szXMLString[0] == '/')
{
//如果是结束
mpCurrentFrame = mpCurrentFrame->GetParentFrame();
mbDepthClose = true;
}
else
{
mbDepthClose = false;
if( NULL == mpCurrentFrame)
{
mpCurrentFrame = &mRoot;
}
SXMLFrame* tNewFrame = new SXMLFrame;
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;
}
}
return true;
}
用XML工具做了一个简单的XML文件。
<?xml version="1.0" encoding="UTF-8"?> <!-- edited with XML Explorer v2.0 by Mergesoft (www.mergesoft.com)--> <root> <Honghaier Name="红孩儿" Age="26"></Honghaier> </root>
在C++代码中
可以这样使用
CXMLFile xmlfile;
xmlfile.Open("1.xml");
SXMLFrame* mRootFrame = CXMLFile::GetRoot();
int ChildNum = mRootFrame ->GetChildNum();
for(int i = 0 ; i < ChildNum ; i++)
{
SXMLFrame* tChileFrame = mRootFrame ->GetChildFrame (i);
SXMLAttrib* tAttrib = tChileFrame->GetAttrib("Age");
print("%s : %s= %s /n",mChileFrame ->mFrameName,tAttrib->mKeyName,tAttrib->mValue);
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Linux
# 读XML
# 的类
# 的类实现代码
# LINUX 查找tomcat日志关键词命令
# Linux 下安装 memcached 及 memcacheq的方法
# Linux服务器下PHPMailer发送邮件失败的问题解决
# Linux在shell中自动生成1到100的数组方法(两种方法)
# Linux 单个tomcat多实例部署shell脚本详解
# Linux 中的nc命令小结
# 详解阿里云LINUX服务器配置HTTPS(NGINX)
# Linux UDP socket 设置为的非阻塞模式与阻塞模式区别
# 用了
# 希望能
# 写了
# 还不错
# 不能用
# 谢谢大家
# 跳过
# 配置文件
# 键值
# 写于
# 键名
# GetChildNum
# szFrameName
# GetFrame_Depth
# GetSiblFrame
# Index
# GetChildFrame
# mpParentFrame
# mpChiFrame
# mpSiblFrame
相关文章:
如何在Golang中使用encoding/gob序列化对象_存储和传输数据
建站之星后台管理如何实现高效配置?
官网建站费用明细查询_企业建站套餐价格及收费标准指南
广德云建站网站建设方案与建站流程优化指南
孙琪峥织梦建站教程如何优化数据库安全?
制作企业网站建设方案,怎样建设一个公司网站?
学校建站服务器如何选型才能满足性能需求?
相册网站制作软件,图片上的网址怎么复制?
专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?
韩国服务器如何优化跨境访问实现高效连接?
建站之星展会模板:智能建站与自助搭建高效解决方案
建站之星如何保障用户数据免受黑客入侵?
高端网站建设与定制开发一站式解决方案 中企动力
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
济南企业网站制作公司,济南社保单位网上缴费步骤?
家具网站制作软件,家具厂怎么跑业务?
如何彻底卸载建站之星软件?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
建站与域名管理如何高效结合?
C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换
天河区网站制作公司,广州天河区如何办理身份证?需要什么资料有预约的网站吗?
网站制作需要会哪些技术,建立一个网站要花费多少?
建站之星如何快速更换网站模板?
深圳网站制作培训,深圳哪些招聘网站比较好?
如何在Golang中使用replace替换模块_指定本地或远程路径
建站之星下载版如何获取与安装?
建站之星如何快速生成多端适配网站?
电商网站制作公司有哪些,1688网是什么意思?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
如何在云主机快速搭建网站站点?
网站制作的步骤包括,正确网址格式怎么写?
如何快速搭建高效香港服务器网站?
高防服务器租用如何选择配置与防御等级?
如何快速重置建站主机并恢复默认配置?
如何通过老薛主机一键快速建站?
如何通过FTP空间快速搭建安全高效网站?
香港服务器WordPress建站指南:SEO优化与高效部署策略
外贸公司网站制作哪家好,maersk船公司官网?
如何安全更换建站之星模板并保留数据?
建站10G流量真的够用吗?如何应对访问高峰?
网站制作公司,橙子建站是合法的吗?
如何通过虚拟主机快速搭建个人网站?
ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?
长沙做网站要多少钱,长沙国安网络怎么样?
建站主机如何安装配置?新手必看操作指南
微信小程序 五星评分(包括半颗星评分)实例代码
如何在橙子建站上传落地页?操作指南详解
南宁网站建设制作定制,南宁网站建设可以定制吗?
建站主机与虚拟主机有何区别?如何选择最优方案?
*请认真填写需求信息,我们会在24小时内与您取得联系。