开发者社区> 问答> 正文

TinyXml 读写XML文件:报错

使用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文件读取节点元素,进行打印

文章出处:http://blog.csdn.net/chexlong/article/details/6452538

展开
收起
kun坤 2020-06-07 13:53:18 777 0
1 条回答
写回答
取消 提交回答
  • 正在使用tinyxml,挺好的,不错

    ######

    嗯,谢谢。

    同时有个TinyXml++的扩展,以及TinyXml-2,。

    ######

          请问你能解析过word(.docx)提取出来的document.xml的文件吗???小弟现在需要一点指导,谢谢!!!

    2020-06-07 13:53:24
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关课程

更多

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载