热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

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

这篇文章主要介绍了Linux下读XML的类详解及实现代码的相关资料,需要的朋友可以参考下

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

在Linux下写程序,常需要读一些配置文件。现有的XML工具很多,可以方便的编辑和生成XML。

但VC中用的XML解析器在Linux下不能用。只好自已写了个。用了一下,还不错。

 #include 
#include 


// ********************************************************************** //
// 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 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] == '&#63;')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文件。

 

<&#63;xml version="1.0" encoding="UTF-8"&#63;>


 


 

 

在C++代码中

可以这样使用

CXMLFile  xmlfile;

xmlfile.Open("1.xml");

SXMLFrame* mRootFrame = CXMLFile::GetRoot();

int ChildNum = mRootFrame ->GetChildNum();

 

for(int i = 0 ; i GetChildFrame (i);

    SXMLAttrib* tAttrib = tChileFrame->GetAttrib("Age");

    print("%s : %s= %s /n",mChileFrame ->mFrameName,tAttrib->mKeyName,tAttrib->mValue);

}

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


推荐阅读
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • Docker的安全基准
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
author-avatar
mobiledu2502878025
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有