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

📄 xmlparser.cpp

📁 液晶电视完整代码可实现人机界面
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------- //函数名:	CXMLParser::AddRootNode//功能描述:	加根节点//作   者:	乔立//日   期:	2002-02-25//输   入:  char *RootNode : 根结点名称//          int n : 属性对个数//          char *AttriName : 属性名称//          char *AttriValues : 属性值//修   改: 如果无属性,请只输入RootNode//修   改://日   期://版   本://------------------------------------------------------------------- void CXMLParser::AddRootNode( char *RootNode ,int n,... ){	char *AttriName=NULL;	char *AttriValues=NULL;		FreeParser();	InsIdxbuf();	m_CurrNode = 0;	m_idxbuf[0].Parent = -1;	m_idxbuf[0].Brother = -1;	m_idxbuf[0].Child  = -1;	m_idxbuf[0].Name = AddTxt( RootNode );	m_idxbuf[0].Value = NULL;			va_list ap;		va_start( ap , RootNode );					AttriName = va_arg( ap , char * );			AttriValues = va_arg( ap , char * );						ADDAttriByTag( RootNode, AttriName , AttriValues );	m_IdxNum = 1;}//------------------------------------------------------------------- //函数名:	CXMLParser::AddChildNode//功能描述:	加子节点//作   者:	乔立//日   期:	2002-02-25//输   入: char *ParentNode :父节点名称//       : char *ChildNode :子节点名称//       : char *AttriName : 属性名称(默认为NULL)//       : char *AttriValues :属性值(默认为NULL)//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::AddChildNode( char *ParentNode , char *ChildNode , char *AttriName , char *AttriValues ){	if ( m_IdxBufLen-m_IdxNum <= 0 )	{		InsIdxbuf() ;	}	if ( m_idxbuf[m_CurrNode].Child < 0 )		// 父节点的长节点	{		m_idxbuf[m_CurrNode].Child  = m_IdxNum;	}	else	{		int tmpnode;		for ( tmpnode=m_idxbuf[m_CurrNode].Child; m_idxbuf[tmpnode].Brother > 0; )		{			tmpnode = m_idxbuf[tmpnode].Brother;		}		m_idxbuf[tmpnode].Brother = m_IdxNum;	}	m_idxbuf[m_IdxNum].Parent = m_CurrNode;	m_idxbuf[m_IdxNum].Brother = -1;	m_idxbuf[m_IdxNum].Child  = -1;	m_idxbuf[m_IdxNum].Name = AddTxt( ChildNode );	m_idxbuf[m_IdxNum].Value = NULL;	m_CurrNode = m_IdxNum++;		ADDAttriByTag( ChildNode, AttriName , AttriValues );	return M_SUCCESS;}//------------------------------------------------------------------- //函数名:	CXMLParser::AddBrotherNode//功能描述:	加兄弟节点//作   者:	乔立//日   期:	2002-02-25//输   入: char *LocalNode :本节点名称(可通过GetCurrNode获取)//          char *BrotherNode :右兄弟节点名称//          char *AttriName : 属性名称(默认为NULL)//          char *AttriValues :属性值(默认为NULL)//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::AddBrotherNode( char *LocalNode , char *BrotherNode , char *AttriName , char *AttriValues ){	if ( m_IdxBufLen-m_IdxNum <= 0 )	{		InsIdxbuf() ;	}	m_idxbuf[m_CurrNode].Brother  = m_IdxNum;	m_idxbuf[m_IdxNum].Parent = m_idxbuf[m_CurrNode].Parent;	m_idxbuf[m_IdxNum].Brother = -1;	m_idxbuf[m_IdxNum].Child  = -1;	m_idxbuf[m_IdxNum].Name = AddTxt( BrotherNode );	m_idxbuf[m_IdxNum].Value = NULL;	m_CurrNode = m_IdxNum++;		ADDAttriByTag( BrotherNode, AttriName , AttriValues );	return M_SUCCESS;}//------------------------------------------------------------------- //函数名:	CXMLParser::AddValuesByTag//功能描述:	为指定tag赋值//作   者:	乔立//日   期:	2002-02-25//输   入: char *TagName :节点名称//          char *Values :节点值//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::AddValuesByTag( char *TagName , char *Value ){	m_idxbuf[m_CurrNode].Value  = AddTxt( Value );	return M_SUCCESS;}//------------------------------------------------------------------- //函数名:	CXMLParser::AddValuesByTag//功能描述:	为指定节点添加属性//作   者:	乔立//日   期:	2002-02-25//输   入: char *TagName : 节点名称//          char *AttriName : 属性名称(默认为NULL)//          char *AttriValues :属性值(默认为NULL)//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::ADDAttriByTag( char *TagName , char *AttriName , char *AttriValues ){	char tmpbuf[MAXLINE + 1];		if ( AttriName == NULL || AttriValues == NULL )	{		return M_SUCCESS;	}	if ( m_idxbuf[m_CurrNode].Attri != NULL )	{		sprintf( tmpbuf , "%s %s=\"%s\"" , m_idxbuf[m_CurrNode].Attri, AttriName , AttriValues );	}	else	{		sprintf( tmpbuf , " %s=\"%s\"" , AttriName , AttriValues );	}	m_idxbuf[m_CurrNode].Attri = AddTxt( tmpbuf );		return M_SUCCESS;}//------------------------------------------------------------------- //函数名:	CXMLParser::SaveToLocal//功能描述:	保留XML文档//作   者:	乔立//日   期:	2002-02-25//输   入: char *filename :文件名//修   改://修   改://日   期://版   本://------------------------------------------------------------------- void CXMLParser::SaveToLocal( char *filename ){	try	{		remove( filename );		ofstream tfile( filename , ios::app | ios::trunc );					tfile << XMLToString() << endl;	}	catch( ... )	{		printf( "Catch Error!\n" );		return;	}		return;}//------------------------------------------------------------------- //函数名:	CXMLParser::Locate//功能描述: 在子树中按照节点属性定位//作   者:	乔立//日   期:	2002-02-25//参   数:  char *TagName : 节点名//			char *ArriName : 属性名//          char *Values : 属性值//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::Locate( char *TagName , char *ArriName , char *Values ){	char *str;	char buf[M_MAX_ITEMCONTENT_LEN];	char tmp[M_MAX_ITEMCONTENT_LEN];	int  Ret=0;		memset( buf , 0 , M_MAX_ITEMCONTENT_LEN*sizeof(char) );	memset( tmp , 0 , M_MAX_ITEMCONTENT_LEN*sizeof(char) );		try	{		sprintf( tmp , "%s=\"%s\"" , ArriName , Values );				Ret = GetChildNode( buf );				// 遍历子节点		while( Ret == 0 )		{			if( strcmp( buf , TagName ) == 0 )			{				str = strstr( m_idxbuf[m_CurrNode].Attri , tmp );				if( str != NULL )					return M_SUCCESS;			}			Ret = GetRightNode( buf , buf );		} // end of while (Ret)		return GENERR;	}    catch( ... )	{		return GENERR;	}	}//------------------------------------------------------------------- //函数名:	CXMLParser::Locate//功能描述:	在子树中按照节点定位//作   者:	乔立//日   期:	2002-02-25//参   数:  char *TagName : 节点名//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::Locate( char *TagName ){	char buf[M_MAX_ITEMCONTENT_LEN];	int  Ret=0;		memset( buf , 0 , M_MAX_ITEMCONTENT_LEN*sizeof(char) );		try	{		Ret = GetChildNode( buf );				// 遍历子节点		while( Ret == 0 )		{			if( strcmp( buf , TagName ) == 0 )			{				return M_SUCCESS;			}			Ret = GetRightNode( buf , buf );		} // end of while (Ret)		return GENERR;	}    catch( ... )	{		return GENERR;	}	}//------------------------------------------------------------------- //函数名:	CXMLParser::reset//功能描述:	//作   者:	//日   期:	2002-02-25//修   改://修   改://日   期://版   本://------------------------------------------------------------------- void CXMLParser::reset(){	m_CurrNode = 0;}//------------------------------------------------------------------- //函数名:	CXMLParser::ReplaceAttriValue//功能描述:	替换属性值//作   者:	乔立//日   期:	2002-04-02//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::ReplaceAttriValue( char *AttriName , char *Value ){	char tmpbuf[MAXLINE + 1];		sprintf( tmpbuf , " %s=\"%s\"" , AttriName , Value );	m_idxbuf[m_CurrNode].Attri = AddTxt( tmpbuf );	return M_SUCCESS;}//------------------------------------------------------------------- //函数名:	CXMLParser::ReplaceValues//功能描述:	替换值域//作   者:	乔立//日   期:	2002-04-02//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::ReplaceValues( char *TagName , char *Value ){	m_idxbuf[m_CurrNode].Value = AddTxt( Value );	return M_SUCCESS;}//------------------------------------------------------------------- //函数名:	CXMLParser::RemoveCurrNode//功能描述:	去掉当前节点, 并将当前指针移动到其右节点//作   者:	乔立//日   期:	2002-04-04//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::RemoveCurrNode(){	int tmpnode;	// 暂忽略删除子树	tmpnode = m_idxbuf[m_CurrNode].Parent;	if ( tmpnode != -1 )	{		tmpnode = m_idxbuf[tmpnode].Child;	}	if ( tmpnode == m_CurrNode )	{		// 当前节点为父节点的长节点		m_idxbuf[m_idxbuf[m_CurrNode].Parent].Child = m_idxbuf[m_CurrNode].Brother;	} 	else 	{		// 修改左节点的 Brother		while ( m_idxbuf[tmpnode].Brother != -1 && m_idxbuf[tmpnode].Brother != m_CurrNode )		{			tmpnode = m_idxbuf[tmpnode].Brother;		}		if ( m_idxbuf[tmpnode].Brother == m_CurrNode )		{			m_idxbuf[tmpnode].Brother = m_idxbuf[m_CurrNode].Brother;		}	}	tmpnode = m_idxbuf[m_CurrNode].Brother;	m_idxbuf[m_CurrNode].Parent = -1;	m_idxbuf[m_CurrNode].Brother = -1;	m_idxbuf[m_CurrNode].Child = -1;	m_idxbuf[m_CurrNode].Name = NULL;	m_idxbuf[m_CurrNode].Value = NULL;	m_idxbuf[m_CurrNode].Attri = NULL;	m_CurrNode = tmpnode;		if ( m_CurrNode >= 0 )	{		return 0;	} 	else 	{		return -1;	}}//------------------------------------------------------------------- //函数名: CXMLParser::GetValuesByFullName//功能描述: 根据节点路径取出Value值,不修改xml的指针结构//作   者: 乔立//日   期: 2002-05-16//修   改://修   改://日   期://版   本://------------------------------------------------------------------- int CXMLParser::GetValuesByFullName( char *TagStr, char *Value ){	int tmpnode = m_CurrNode; 	m_CurrNode = 0;	try	{		// 分解为具体节点		char TagMsg[20][100];		int  Num = UnPackMsg( TagStr , TagMsg );		if( Num == 0 )		{			return GENERR;		}		int i = 1;		// 忽略根节点		while( i < Num ) 		{ 			if ( Locate( TagMsg[i] ) )			{				m_CurrNode = tmpnode;				return GENERR;			}			i++; 		}		if ( m_idxbuf[m_CurrNode].Value != NULL )		{			strcpy( Value , m_idxbuf[m_CurrNode].Value );		}		else		{			Value = 0;		}	}	catch( ... )	{		printf("GetValuesByFullName Faied\n");		m_CurrNode = tmpnode;		return GENERR;	}	m_CurrNode = tmpnode;	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -