欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Linux 下讀XML 的類詳解及實現(xiàn)代碼

 更新時間:2017年03月08日 09:48:39   投稿:lqh  
這篇文章主要介紹了 Linux 下讀XML 的類詳解及實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下

 Linux 下讀XML 的類詳解及實現(xiàn)代碼

在Linux下寫程序,常需要讀一些配置文件?,F(xiàn)有的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;  //屬性數(shù)量
 SXMLAttrib* mAttrArray;  //屬性數(shù)組

 SXMLFrame* mpSiblFrame; //兄弟結(jié)點
 SXMLFrame* mpChiFrame;  //子結(jié)點
 SXMLFrame* mpParentFrame; //父結(jié)點
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] == '/')
 {
 //如果是結(jié)束
 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);

}

 感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • linux Cron定時執(zhí)行帶參數(shù)的PHP代碼

    linux Cron定時執(zhí)行帶參數(shù)的PHP代碼

    前面有篇文章簡單介紹了了cPanel控制面板下如何使用時鐘守護作業(yè)的方法,但有時,我們希望執(zhí)行帶參數(shù)的php代碼,即如何傳遞參數(shù)給cron,飄易分享下方法如下
    2021-07-07
  • 有效學習Linux系統(tǒng)的4個方法

    有效學習Linux系統(tǒng)的4個方法

    這篇文章主要為大家詳細介紹了有效學習Linux系統(tǒng)的4個方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • linux Ubuntu下SSH無密碼驗證配置的方法步驟

    linux Ubuntu下SSH無密碼驗證配置的方法步驟

    這篇文章主要介紹了linux Ubuntu下實現(xiàn)SSH無密碼驗證配置的方法步驟,文中給出了詳細的步驟介紹,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • linux?服務器安裝gcc8的問題記錄

    linux?服務器安裝gcc8的問題記錄

    我原本安裝了gcc13.0版本,但是版本太高了,導致我安裝cuda報錯gcc版本太高,所以就安裝低版本的gcc,下面通過本文給大家分享linux?服務器安裝gcc8的問題記錄,感興趣的朋友一起看看吧
    2024-07-07
  • Linux sshd_config配置手冊中文版

    Linux sshd_config配置手冊中文版

    sshd默認從 /etc/ssh/sshd_config 文件(或通過 -f 命令行選項指定的文件)讀取配置信息。配置文件是由"指令 值"對組成的,每行一個??招泻鸵?#'開頭的行都將被忽略。如果值中含有空白符或者其他特殊符號,那么可以通過在兩邊加上雙引號(")進行界定
    2014-03-03
  • Linux中的read命令使用之交互輸入和腳本編寫

    Linux中的read命令使用之交互輸入和腳本編寫

    這篇文章主要介紹了Linux中的read命令使用之交互輸入和腳本編寫,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 詳解linux usb host驅(qū)動編寫入門

    詳解linux usb host驅(qū)動編寫入門

    本篇文章主要介紹了詳解linux usb host驅(qū)動編寫入門,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • 如何解決Ubuntu18.04循環(huán)登錄/卡在開機界面/無法進入圖形界面的問題

    如何解決Ubuntu18.04循環(huán)登錄/卡在開機界面/無法進入圖形界面的問題

    這篇文章主要介紹了如何解決Ubuntu18.04循環(huán)登錄/卡在開機界面/無法進入圖形界面的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-05-05
  • CentOS系統(tǒng)臨時禁止一個用戶的方法

    CentOS系統(tǒng)臨時禁止一個用戶的方法

    這篇文章主要介紹了給大家介紹了在CentOS系統(tǒng)中,如何臨時禁止一個用戶的方法,在CentOS系統(tǒng)中臨時禁止一個用戶,是臨時的不讓這個用戶使用Linux系統(tǒng),而不是刪除它。下面通過這篇文章來一起學習學習下吧。
    2016-11-11
  • linux(center OS7)安裝JDK、tomcat、mysql 搭建java web項目運行環(huán)境

    linux(center OS7)安裝JDK、tomcat、mysql 搭建java web項目運行環(huán)境

    這篇文章主要介紹了linux(center OS7)安裝JDK、tomcat、mysql 搭建java web項目環(huán)境,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12

最新評論