使用Tinyxml创建和读取XML文件的优点:1,可在Windows和Linux中使用;2,方便易学,易用,可在http://sourceforge.net/projects/tinyxml/获取源代码。将其中的文件tinystr.h,tinyxml.h,tinystr.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp和tinyxml.cpp拷贝到您的工程目录,即可方便使用。
下边我写了一个简单的测试程序,创建XML文件,之后从该文件中读取XML节点元素。测试程序在VS2005中测试通过。
#include <iostream> #include "tinyxml.h" using namespace std; #pragma warning(disable:4996) #define XML_STR_FILE "cat.xml" #define XML_STR_ROOT "xml-root" #define XML_STR_CAT_INFO "cat-info" #define XML_STR_CAT_NUM "num" #define XML_STR_CAT_AGE "age" #define XML_STR_CAT_COLOR "color" #define XML_STR_CAT_NAME "name" #define IN #define OUT #define RET_OK 0 #define RET_ERR -1 #define NAME_LENGTH 20 #define COLOR_LENGTH 20 #define BUF_SIZE 32 #define XML_RETURN(x) { if( RET_OK != (x) ) return RET_ERR; } #define XML_ASSERT(x) { if( NULL == (x) ) return RET_ERR; } struct CAT_INFO { CAT_INFO():iAge(0) { szName[0] = '/0'; szColor[0] = '/0'; }; int iAge; //age char szName[NAME_LENGTH]; //name char szColor[COLOR_LENGTH]; //color }; typedef CAT_INFO * PCAT_INFO; class Cat_List_Info { public: Cat_List_Info( bool bDel ):bIsDelete( bDel ), iNum( 0 ), pCatList( NULL ) { }; ~Cat_List_Info() { if( bIsDelete && pCatList ) { delete []pCatList; pCatList = NULL; } }; public: int iNum; //cats number PCAT_INFO pCatList; //list private: bool bIsDelete; }; //add leaf node int AddLeafNode( TiXmlNode* pElmParent, const char* pszNode, const char* pszText ) { TiXmlElement elmNode(pszNode); TiXmlText elmText(pszText); XML_ASSERT( elmNode.InsertEndChild( elmText ) ); XML_ASSERT( pElmParent->InsertEndChild( elmNode ) ); return RET_OK; } //get leaf node int GetLeafNode( TiXmlNode* pElmParent, char* pszNode, char* pszText ) { TiXmlNode *pTemp; if ( pElmParent && ( pTemp = pElmParent->FirstChild( pszNode ) ) ) { if ( pTemp = pTemp->FirstChild() ) { strcpy( pszText, pTemp->Value() ); return RET_OK; } } return RET_ERR; } int WriteXmlToFile( IN Cat_List_Info *pCats ) { TiXmlDeclaration Declaration( "1.0","", "" ); TiXmlDocument xmlDoc( XML_STR_FILE ); xmlDoc.InsertEndChild( Declaration ); TiXmlElement elmRoot( XML_STR_ROOT ); char szBuf[BUF_SIZE]; szBuf[0] = '/0'; if ( !pCats ) { return RET_ERR; } if ( pCats->iNum > 0) { //num sprintf( szBuf,"%d", pCats->iNum ); XML_RETURN( AddLeafNode( &elmRoot, XML_STR_CAT_NUM, szBuf ) ); } else { return RET_ERR; } for ( int i = 0; i < pCats->iNum; i++ ) { TiXmlElement elmCat( XML_STR_CAT_INFO ); //name if ( '/0' != pCats->pCatList[i].szName[0] ) { XML_RETURN( AddLeafNode( &elmCat, XML_STR_CAT_NAME, pCats->pCatList[i].szName ) ); } //age sprintf( szBuf,"%d", pCats->pCatList[i].iAge ); XML_RETURN( AddLeafNode( &elmCat, XML_STR_CAT_AGE, szBuf ) ); //color if ( '/0' != pCats->pCatList[i].szColor[0] ) { XML_RETURN( AddLeafNode( &elmCat, XML_STR_CAT_COLOR, pCats->pCatList[i].szColor ) ); } XML_ASSERT( elmRoot.InsertEndChild( elmCat ) ); } XML_ASSERT( xmlDoc.InsertEndChild( elmRoot ) ); //save xmlDoc.SaveFile(); return RET_OK; } int ReadXmlFromFile( OUT Cat_List_Info *pCats ) { TiXmlElement *pRootNode = NULL; TiXmlElement *pTemp = NULL; char szBuf[BUF_SIZE]; szBuf[0] = '/0'; if (!pCats) { return RET_ERR; } TiXmlDocument xmlDoc( XML_STR_FILE ); if( !xmlDoc.LoadFile() ) return RET_ERR; XML_ASSERT( pRootNode = xmlDoc.RootElement() ); pTemp = pRootNode->FirstChildElement( XML_STR_CAT_NUM ); if ( pTemp ) { GetLeafNode( pRootNode, XML_STR_CAT_NUM, szBuf ); pCats->iNum = atoi( szBuf ); } if ( pCats->iNum > 0 ) { TiXmlNode *pCat = NULL; pCat = pRootNode->FirstChild( XML_STR_CAT_INFO ); if ( pCat ) { for ( int i = 0; i < pCats->iNum; i++ ) { //name GetLeafNode( pCat, XML_STR_CAT_NAME, pCats->pCatList[i].szName ); //age GetLeafNode( pCat, XML_STR_CAT_AGE, szBuf ); pCats->pCatList[i].iAge = atoi(szBuf); //color GetLeafNode( pCat, XML_STR_CAT_COLOR, pCats->pCatList[i].szColor ); pCat = pCat->NextSibling(); } } } else { return RET_ERR; } return RET_OK; } int main(int argc, char* argv[]) { Cat_List_Info cats(true); cats.iNum = 2; cats.pCatList = new CAT_INFO[cats.iNum]; if ( NULL == cats.pCatList ) { cout<<"no memory..."<<endl; return RET_ERR; } cats.pCatList[0].iAge = 5; strcpy( cats.pCatList[0].szColor, "white" ); strcpy( cats.pCatList[0].szName, "Bob" ); cats.pCatList[1].iAge = 6; strcpy( cats.pCatList[1].szColor, "black" ); strcpy( cats.pCatList[1].szName, "Tom" ); int iRet = WriteXmlToFile( &cats ); iRet = ReadXmlFromFile( &cats ); if ( RET_OK == iRet ) { for ( int i = 0; i < cats.iNum; i++ ) { cout<<i<<" cat's name is "<<cats.pCatList[i].szName<<endl; cout<<i<<" cat's age is "<<cats.pCatList[i].iAge<<endl; cout<<i<<" cat's color is "<<cats.pCatList[i].szColor<<endl; } } system( "pause" ); return 0; }下边是生成的cat.xml文件
<?xml version="1.0" ?> <xml-root> <num>2</num> <cat-info> <name>Bob</name> <age>5</age> <color>white</color> </cat-info> <cat-info> <name>Tom</name> <age>6</age> <color>black</color> </cat-info> </xml-root>
从cat.xml文件读取节点元素,进行打印
正在使用tinyxml,挺好的,不错
######嗯,谢谢。
同时有个TinyXml++的扩展,以及TinyXml-2,。
请问你能解析过word(.docx)提取出来的document.xml的文件吗???小弟现在需要一点指导,谢谢!!!
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。