📄 xmlparser.cpp
字号:
//------------------------------------------------------------------- //函数名: 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 + -