📄 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 + -