📄 xmlparser.cpp
字号:
//------------------------------------------------------------------- //文件名:xmlparser.cpp//创建人:乔立//日 期:2002-02-25//修改人:陈熹//日 期:2002-10-30//描 述:解析XML类//版 本://Copyright (c) 2001 EITOP//------------------------------------------------------------------- #include "xmlparser.h"//------------------------------------------------------------------- //函数名: CXMLParser::TxtToXML//功能描述: 通过节点内容构建节点指针//作 者: 郝昌富//日 期: 2002-05-31//输 入: //修 改://日 期://版 本://------------------------------------------------------------------- void CXMLParser::TxtToXML(){ int Parent = -1; int OldBrother = -1; char * currstr; char * endstr; currstr = strstr(m_txtbuf, "<"); // 有效节点的开始 while ( currstr != NULL ) { //printf("The node: %d\n", m_CurrNode ); *currstr = 0; currstr++; switch ( *currstr ){ case '?' : // 暂不处理'<? ... ?>'类型数据 currstr = strstr(currstr+1, "?>"); if ( currstr == NULL ) { printf("非法的xml文件(<?不匹配)!\n" ); } break; case '!' : // 暂不处理'<! ... >'类型数据 currstr = strstr(currstr+1, ">"); if ( currstr == NULL ) { printf( "非法的xml文件(<!不匹配)!\n" ); } break; case '/': // 节点结束 if ( m_IdxNum <= 0 || m_IdxNum > m_IdxBufLen ) { printf( "非法的xml文件!\n" ); } if ( m_idxbuf[m_CurrNode].closed ) { m_CurrNode = m_idxbuf[m_CurrNode].Parent; } CleanValue( m_idxbuf[m_CurrNode].Value ); OldBrother = m_CurrNode; Parent = m_idxbuf[m_CurrNode].Parent; currstr = strstr(currstr+1, ">"); if ( currstr == NULL ) { printf( "非法的xml文件(>不匹配)!" ); } m_idxbuf[m_CurrNode].closed = 1; break; default: if ( m_IdxBufLen-m_IdxNum <= 0 ) { InsIdxbuf() ; } m_idxbuf[m_IdxNum].Parent = Parent ; if ( Parent >= 0 ) { if ( m_idxbuf[Parent].Child < 0 ) { m_idxbuf[Parent].Child= m_IdxNum ; // 父节点的长节点 } } if ( OldBrother >= 0 ) { m_idxbuf[OldBrother].Brother = m_IdxNum ; } // 节点起始串必为节点名称, 且无任何分割符 m_idxbuf[m_IdxNum].Name = currstr ; endstr = strstr(currstr+1, ">"); if ( endstr == NULL ) { printf( "非法的xml文件(>不匹配)!" ); } currstr = endstr + 1; if ( *(endstr-1) == '/' ) // 不存在下级节点 { OldBrother = m_IdxNum; *(endstr-1) = 0 ; } else { Parent = m_IdxNum; OldBrother = -1; *endstr = 0; m_idxbuf[m_IdxNum].Value = GetValueFromStr( endstr+1 ); m_idxbuf[m_IdxNum].closed = 0; // 该节点尚未闭合 } // 节点名称后为节点属性 m_idxbuf[m_IdxNum].Attri = GetAttrFromStr( m_idxbuf[m_IdxNum].Name ) ; m_CurrNode = m_IdxNum; m_IdxNum++; // end of default } // end of switch currstr = strstr(currstr, "<"); // 有效节点的开始 } return;}//------------------------------------------------------------------- //函数名: CXMLParser::GetRootNode//功能描述: 获取根节点//作 者: 乔立//日 期: 2002-02-25//输 出: char *NodeName : Root Node Name!//修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetRootNode( char *NodeName ){ m_CurrNode = 0; if ( m_idxbuf[m_CurrNode].Name == NULL ) { return FALSE; } strcpy( NodeName , m_idxbuf[m_CurrNode].Name ); return M_SUCCESS;}//------------------------------------------------------------------- //函数名: CXMLParser::GetCurrNode//功能描述: 获取本节点//作 者: 乔立//日 期: 2002-02-25//输 出: char *NodeName : Node Name!//修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetCurrNode( char *NodeName ){ strcpy( NodeName , m_idxbuf[m_CurrNode].Name ); return M_SUCCESS;}//------------------------------------------------------------------- //函数名: CXMLParser::GetChildNode//功能描述: 获取子节点//作 者: 乔立//日 期: 2002-02-25//输 出: char *childnode : Child Node Name!//修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetChildNode( char *childnode ){ if ( GetChildNode() == 0 ) { strcpy( childnode , m_idxbuf[m_CurrNode].Name ); return M_SUCCESS; } else { return GENERR; }}//------------------------------------------------------------------- //函数名: CXMLParser::GetChildNode//功能描述: 获取子节点//作 者: 乔立//日 期: 2002-02-25//说 明: 定位ChildNode //修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetChildNode(){ if ( m_idxbuf[m_CurrNode].Child >= 0 ) { m_CurrNode = m_idxbuf[m_CurrNode].Child; return M_SUCCESS; } else { return GENERR; }}//------------------------------------------------------------------- //函数名: CXMLParser::GetRightNode//功能描述: 获取右兄弟节点//作 者: 乔立//日 期: 2002-02-25//输 入: char *node : Current Node Name!// char *rightnode : Right Node Name!//修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetRightNode( char *node , char *rightnode ){ if ( m_idxbuf[m_CurrNode].Brother >= 0 ) { m_CurrNode = m_idxbuf[m_CurrNode].Brother; strcpy( rightnode , m_idxbuf[m_CurrNode].Name ); return M_SUCCESS; } else { return GENERR; }}//------------------------------------------------------------------- //函数名: CXMLParser::GetTagAttri//功能描述: 获取tag属性值//作 者: 乔立//日 期: 2002-02-25//输 入: char *AttriName : Current Attribute Name!//输 出: char *AttriValues : Current Attribute Values!//修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetTagAttri( char *AttriName , char *AttriValues ){ char *substr; char *str1; char *str2; int j=0; str1 = strstr( m_idxbuf[m_CurrNode].Attri , AttriName ); if( str1 == NULL ) { return GENERR; } str2 = strstr( str1 , "=" ); if( str2 == NULL ) { return GENERR; } substr = strstr( str2 , "\"" ); if( substr == NULL ) { return GENERR; } substr+=1; while( *substr != '"' ) { AttriValues[j++] = *substr++; } AttriValues[j]='\0'; return M_SUCCESS;}//------------------------------------------------------------------- //函数名: CXMLParser::GetParentNode//功能描述: 获取父节点//作 者: 乔立//日 期: 2002-02-25//输 出: char *parentnode : Parent Tag Name!//修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetParentNode( char *parentnode ){ if ( GetParentNode() == 0 ) { return GetCurrNode( parentnode ); } else { return GENERR; }}//------------------------------------------------------------------- //函数名: CXMLParser::GetParentNode//功能描述: 获取父节点//作 者: 乔立//日 期: 2002-02-25//输 出: 定位ParentNode //修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetParentNode(){ if ( m_idxbuf[m_CurrNode].Parent >= 0 ) { m_CurrNode = m_idxbuf[m_CurrNode].Parent; return M_SUCCESS; } else { return GENERR; }}//------------------------------------------------------------------- //函数名: CXMLParser::GetValuesFromTag//功能描述: 在本级节点中查找指定Tag的value//作 者: //日 期: //输 入: char *TagName : Tag Name//输 出: char *Values : Values//修 改://修 改://日 期://版 本://------------------------------------------------------------------- int CXMLParser::GetValuesFromTag( char *TagName , char *Value ){ if ( Locate( TagName ) ) { return GENERR; } if ( m_idxbuf[m_CurrNode].Value != NULL ) { strcpy( Value , m_idxbuf[m_CurrNode].Value ); } else { Value = 0; } GetParentNode(); return M_SUCCESS;}//------------------------------------------------------------------- //函数名: CXMLParser::PrtNode//功能描述: 返回XML流//作 者: 乔立//日 期: 2002-02-25//修 改://修 改://日 期://版 本://------------------------------------------------------------------- void CXMLParser::PrtNode( int Node, int depth ){ int i; for ( i=0; i<depth; i++ ) { out_str.Add( "\t" ) ; } out_str.Add( "<" ) ; out_str.Add( m_idxbuf[Node].Name ); if ( m_idxbuf[Node].Attri != NULL ) { out_str.Add( " " ) ; out_str.Add( m_idxbuf[Node].Attri ); } out_str.Add( ">\n" ) ; if ( m_idxbuf[Node].Value != NULL ) { for ( i=0; i<depth+1; i++ ) { out_str.Add( "\t" ) ; } out_str.Add( m_idxbuf[Node].Value ); out_str.Add( "\n" ) ; } int tmpnode = m_idxbuf[Node].Child; if ( tmpnode >= 0 ) { PrtNode( tmpnode, depth+1 ); } for ( i=0; i<depth; i++ ) { out_str.Add( "\t" ) ; } out_str.Add( "</" ) ; out_str.Add( m_idxbuf[Node].Name ); out_str.Add( ">\n" ) ; tmpnode = m_idxbuf[Node].Brother; if ( tmpnode >= 0 ) { PrtNode( tmpnode, depth ); }}char *CXMLParser::XMLToString(){ out_str.Truncate(); PrtNode( 0, 0 ); return out_str.str;}//------------------------------------------------------------------- //函数名: CXMLParser::GetCurrentStream//功能描述: 返回当前指针 m_currstream//作 者: 乔立//日 期: 2002-02-25//修 改://修 改://日 期://版 本://------------------------------------------------------------------- char *CXMLParser::GetCurrentStream(){ return m_txtbuf;}//------------------------------------------------------------------- //函数名: CXMLParser::InitXMLStream//功能描述: //作 者: 乔立//日 期: 2002-02-25//修 改://修 改://日 期://版 本://------------------------------------------------------------------- void CXMLParser::InitXMLStream(){}//------------------------------------------------------------------- //函数名: CXMLParser::InitXMLStream//功能描述: //作 者: 乔立//日 期: 2002-02-25//修 改://修 改://日 期://版 本://------------------------------------------------------------------- void CXMLParser::InitXMLStream( char *filestream ){}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -