⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xmlparser.h

📁 液晶电视完整代码可实现人机界面
💻 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 + -