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

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