📄 xmlparser.h
字号:
#ifndef _XMLPARSER_H_#define _XMLPARSER_H_#include "const_def.h"#include "xmlpartool.h"#define IDXBUFINIT 300 // 初始节点指针缓冲池大小#define TXTBUFINIT 300*60 // 初始节点内容缓冲池大小class XMLIdx{public: int Parent; int Brother; int Child; int closed; char *Name; char *Value; char *Attri; XMLIdx() { Parent = -1; Brother = -1; Child = -1; closed = 1; Name = NULL; Value = NULL; Attri = NULL; }};class mystring{public: int len; char *str; mystring() { len = 0; str = NULL; } ~mystring() { len = 0; if ( str != NULL ) { delete str; } } int Add( char * txt ) { if ( ( str = (char *)realloc( str, len+strlen(txt)+1 )) != NULL ) { memset( str+len, 0, strlen(txt)+1 ); len += strlen(txt)+1; strcat( str, txt ); return 0; } else return GENERR; } void Truncate() { len = 0; if ( str != NULL ) { delete str; str = NULL; } }};// XML 解析类class CXMLParser{private: XMLIdx *m_idxbuf; // 节点指针缓冲池 int m_IdxBufLen; // 节点指针缓冲池大小 int m_IdxNum; // 节点个数 int m_CurrNode; // 当前节点 char *m_txtbuf; // 节点内容缓冲池 int m_TxtBufLen; // 节点内容缓冲池大小 int m_TxtSpace; // 节点内容缓冲池已用长度,含结束符 mystring out_str; // 用于输出xml到字符串 public: //说明:1. 拆包时使用InitConfig( filestream ), filestream为配置文件名称 // 2. 打包时使用InitXMLStream( filestream ), filestream=内部流指针 , 无需另外释放filestream的内存 // 3. 产生新XML文件时使用InitXMLStream() // 4. 程序中请遵循良好的编程规范,在free或delete之后,请将指针置为NULL // 5. 类中方法如遇到重大错误则会抛出CommException异常,请加以捕获 // 6. 类中主要方法均有返回值,且遵循:0 :成功 ;-n : 失败 ( int n = -1 , -2 ... ) // 7. 请不要对象间相互赋值(没有必要),avoid memory leak CXMLParser( CXMLParser& ) { CommException exception( -1 , "CXMLParser( CXMLParser &dt ) Failed!" ); throw exception; } // jolly added 20020402 , overload assignment operator CXMLParser &operator=( CXMLParser& ) { cout << "在此没有必要进行对象赋值" << endl; CommException exception( -1 , "CXMLParser &operator=( CXMLParser& ) Failed!" ); throw exception; } CXMLParser() //构造函数 { m_idxbuf = NULL; m_IdxBufLen = 0; m_IdxNum = 0; m_CurrNode = 0; m_txtbuf = NULL; m_TxtBufLen = 0; m_TxtSpace = 0; }; ~CXMLParser()//析构函数 { if( m_idxbuf != NULL ) { delete []m_idxbuf; m_idxbuf = NULL; } m_IdxBufLen = 0; m_IdxNum = 0; m_CurrNode = 0; if ( m_txtbuf != NULL) { delete m_txtbuf; m_txtbuf = NULL; } m_TxtBufLen = 0; m_TxtSpace = 0; }; // 初始化XML解析类,拆包时调用,filestream为配置文件名称 void InitConfig( char *filename ) { FILE *fp; char line[MAXLINE + 1]; int len=0; FreeParser(); // 打开XML文档 printf("XML File Name =[%s]\n",filename); if( (fp = fopen( filename , "r" )) == NULL ) { printf( "Open XML File Failed!\n" ); return; } else { while( fgets( line , MAXLINE , fp ) ) { len=strlen( line ); if ( m_TxtSpace + len + 1 > m_TxtBufLen ){ if ( InsTxtbuf() ){ fclose(fp); printf( "Alloc memory Failed!\n" ); } } // 忽略回车 line[len-1] = 0; strcat( m_txtbuf , line ); // 节点内容缓冲池已用长度含结束符 m_TxtSpace += len; } } fclose(fp); TxtToXML(); return; }; //通过节点内容构建节点指针 void TxtToXML(); // 获取根节点 int GetRootNode( char *NodeName ); // 获取本节点 int GetCurrNode( char *NodeName ); // 获取子节点 int GetChildNode( char *childnode ); // 获取子节点,只移动指向当前节点的指针 int GetChildNode(); // 获取右兄弟节点 int GetRightNode( char *node , char *rightnode ); // 获取父节点 int GetParentNode( char *parentnode ); // 获取父节点,只移动指向当前节点的指针 int GetParentNode(); // 获取tag属性值 , AttriName:属性名称 , AttriValues : 属性值 //int GetTagAttri( char *TagName , char *AttriName , char *AttriValue ); // 获取tag属性值 , AttriName:属性名称 , AttriValues : 属性值 int GetTagAttri( char *AttriName , char *AttriValue ); // 获取本级节点对应于Tag的value int GetValuesFromTag( char *TagName , char *Value ); // 根据节点路径取出Value值,不修改xml的指针结构 int GetValuesByFullName( char *TagStr, char *Value ); // 转换为字符串 void PrtNode( int Node, int depth ); char *XMLToString(); // Added by HCH -- 2002.04.01 // 获取当前指针 m_currstream; char *GetCurrentStream(); // 初始化XML流,产生新XML文件时,filestream=NULL void InitXMLStream(); // 初始化XML流,打包时调用 , filestream=内部流指针 void InitXMLStream( char *filestream ); // 加根节点,可变参数需配对出现: 属性名称 ,属性值 ... void AddRootNode( char *RootNode , int n , ... ); // 加子节点 int AddChildNode( char *ParentNode , char *ChildNode , char *AttriName=NULL , char *AttriValues=NULL ); // 加兄弟节点 int AddBrotherNode( char *LocalNode , char *BrotherNode , char *AttriName=NULL , char *AttriValues=NULL ); // 为指定tag赋值 int AddValuesByTag( char *TagName , char *Value ); // 为指定节点添加属性 int ADDAttriByTag( char *TagName , char *AttriName , char *AttriValue ); // 保留XML文档 void SaveToLocal( char *filename ); // 在子树中按照节点属性定位 int Locate( char *TagName , char *ArriName , char *Value ); // 在子树中按照节点定位 int Locate( char *TagName ); // 在一个group循环完以后,重置m_tmpstream void reset(); // 替换属性值 int ReplaceAttriValue( char *ArriName , char *Value ); // 替换值域 int ReplaceValues( char *TagName , char *Value ); // 去掉当前节点 int RemoveCurrNode(); void FreeParser() { if( m_idxbuf != NULL ) { delete []m_idxbuf; m_idxbuf = NULL; } m_IdxBufLen = 0; m_IdxNum = 0; m_CurrNode = 0; if ( m_txtbuf != NULL) { delete m_txtbuf; m_txtbuf = NULL; } m_TxtBufLen = 0; m_TxtSpace = 0; } // 增加节点指针缓冲池 int InsIdxbuf() { int len ; if ( m_idxbuf == NULL ) len = IDXBUFINIT; else len = m_IdxBufLen; XMLIdx * xmlidx = new XMLIdx[ m_IdxBufLen + len ]; if ( xmlidx == NULL ) ThrowMsgException( GENERR , "Alloc xml_node memory Failed!" ); for ( int i=0; i<m_IdxBufLen; i++ ){ xmlidx[i].Parent = m_idxbuf[i].Parent; xmlidx[i].Brother = m_idxbuf[i].Brother; xmlidx[i].Child = m_idxbuf[i].Child; xmlidx[i].closed = m_idxbuf[i].closed; xmlidx[i].Name = m_idxbuf[i].Name; xmlidx[i].Value = m_idxbuf[i].Value; xmlidx[i].Attri = m_idxbuf[i].Attri; } if ( m_idxbuf ) delete []m_idxbuf; m_idxbuf = xmlidx; m_IdxBufLen += len; return 0; } // 增加节点内容缓冲池 int InsTxtbuf() { int len ; if ( m_txtbuf == NULL ) len = TXTBUFINIT; else len = m_TxtBufLen; m_txtbuf = (char *)realloc( m_txtbuf , m_TxtBufLen + len ); if ( m_txtbuf == NULL ) ThrowMsgException( GENERR , "Alloc xml_content memory Failed!" ); memset( m_txtbuf+m_TxtBufLen, 0, len ); m_TxtBufLen += len; return 0; } // 添加节点内容 char * AddTxt( char *str ) { int len = strlen(str); if ( m_TxtBufLen-m_TxtSpace-1 < len ){ while ( m_TxtBufLen-m_TxtSpace-1 < len ) m_TxtBufLen += TXTBUFINIT; m_txtbuf = (char *)realloc( m_txtbuf , m_TxtBufLen ); if ( m_TxtBufLen == NULL ) return NULL; } strcpy( m_txtbuf+m_TxtSpace, str ); // 节点内容缓冲池已用长度含结束符 m_TxtSpace += len+1; return m_txtbuf+m_TxtSpace-len-1; }};#endif // _XMLPARSER_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -