TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器, 用来读写配置文件是最好的,可从http://www.grinninglizard.com/tinyxml/index.html这里下载。构建TinyXML 时可以选择是否支持STL, 一般建议选择支持STL。TinyXml的源码包里提供了VC6的工程文件,直接用它就可以生成静态库。然后把tinyxml.h, tinystr.h和lib拷到你工程下, 就可以用了。要注意的是, 如果需要STL支持,在你的工程里要定义一个宏TIXML_USE_STL, 然后把下面代码添加到你的代码里, 这段是摘自TinyXML自带的例子。
我参考了网上的有关TinyXML的文章, 写了一个读写XML的例子,代码如下:
#include
"
tinyxml.h
"
#ifdef TIXML_USE_STL
#include < iostream >
#include < sstream >
using namespace std;
#else
#include < stdio.h >
#endif
#if defined( WIN32 ) && defined( TUNE )
#include < crtdbg.h >
_CrtMemState startMemState;
_CrtMemState endMemState;
#endif
#pragma comment(lib, "tinyxmld_STL.lib")
int WriteXML() ;
int ReadXML() ;
// 读取内存里的一段XML
int ReadXML2() ;
int main( int argc, char * argv[])
...{
cout << " 开始测试! " << endl;
WriteXML() ;
ReadXML() ;
ReadXML2() ;
cout << " 结束测试! " << endl ;
return 0 ;
}
int WriteXML()
...{
TiXmlDocument xmlDoc( " test.xml " ); // 建立一个XML文件
TiXmlDeclaration Declaration( " 1.0 " , " gb2312 " , " yes " ); // 声明XML的属性
xmlDoc.InsertEndChild( Declaration ); // 写入基本的XML头结构
TiXmlNode * pNode = NULL;
TiXmlElement * pRootElm = NULL;
TiXmlElement * pChildeElm = NULL;
TiXmlElement * pItemElm = NULL;
TiXmlText * pText = NULL; // 一个指向Text的指针
pText = new TiXmlText( " good " ) ;
pRootElm = new TiXmlElement( " todo " );
pNode = xmlDoc.InsertEndChild( * pRootElm) ;
pRootElm = pNode -> ToElement() ;
pChildeElm = new TiXmlElement( " child1 " ) ;
pChildeElm -> SetAttribute( " num " , 9 ) ;
pNode = pRootElm -> InsertEndChild( * pChildeElm) ;
TiXmlElement * pChildeElm1 = NULL;
pChildeElm1 = pNode -> ToElement() ;
pChildeElm1 -> InsertEndChild( * pText) ;
delete pChildeElm ;
pChildeElm = NULL ;
pChildeElm = new TiXmlElement( " child2 " ) ;
pChildeElm -> SetAttribute( " num " , 10 ) ;
pNode = pRootElm -> InsertBeforeChild (pChildeElm1, * pChildeElm) ;
TiXmlElement * pChildeElm2 = NULL;
pChildeElm2 = pNode -> ToElement() ;
pChildeElm2 -> InsertEndChild( * pText) ;
xmlDoc.Print() ;
xmlDoc.SaveFile(); // 把XML文件写入硬盘
return 0 ;
}
int ReadXML()
...{
cout << endl ;
cout << " 开始read XML " << endl ;
TiXmlDocument xmlDoc( " test.xml " );
xmlDoc.LoadFile() ;
TiXmlElement * xmlRootElement = 0 ;
TiXmlElement * xmlSubElement = 0 ;
TiXmlNode * pNode = NULL;
pNode = xmlDoc.FirstChild( " todo " ) ;
xmlRootElement = pNode -> ToElement() ;
if (xmlRootElement)
...{
pNode = xmlRootElement -> FirstChild( " child1 " ) ;
xmlSubElement = pNode -> ToElement() ;
cout << xmlSubElement -> Value() << endl ;
cout << xmlSubElement -> Attribute( " num " ) << endl ;
cout << xmlSubElement -> GetText() << endl ;
}
else
...{
cout << " 找不到根元素 " << endl ;
}
cout << " 结束read XML " << endl ;
return 0 ;
}
int ReadXML2()
...{
cout << endl ;
cout << " 开始read XML " << endl ;
const char * demoEnd = " <?xml version= " 1.0 " encoding= " gb2312 " standalone= " yes " ?> "
" <todo> "
" <child2 num= " 10 " >good</child2> "
" <child1 num= " 9 " >good</child1> "
" </todo> " ;
TiXmlDocument xmlDoc;
xmlDoc.Parse( demoEnd ) ;
TiXmlElement * xmlRootElement = 0 ;
TiXmlElement * xmlSubElement = 0 ;
TiXmlNode * pNode = NULL;
pNode = xmlDoc.FirstChild( " todo " ) ;
xmlRootElement = pNode -> ToElement() ;
if (xmlRootElement)
...{
pNode = xmlRootElement -> FirstChild( " child1 " ) ;
xmlSubElement = pNode -> ToElement() ;
cout << xmlSubElement -> Value() << endl ;
cout << xmlSubElement -> Attribute( " num " ) << endl ;
cout << xmlSubElement -> GetText() << endl ;
}
else
...{
cout << " 找不到根元素 " << endl ;
}
cout << " 结束read XML " << endl ;
return 0 ;
}
#ifdef TIXML_USE_STL
#include < iostream >
#include < sstream >
using namespace std;
#else
#include < stdio.h >
#endif
#if defined( WIN32 ) && defined( TUNE )
#include < crtdbg.h >
_CrtMemState startMemState;
_CrtMemState endMemState;
#endif
#pragma comment(lib, "tinyxmld_STL.lib")
int WriteXML() ;
int ReadXML() ;
// 读取内存里的一段XML
int ReadXML2() ;
int main( int argc, char * argv[])
...{
cout << " 开始测试! " << endl;
WriteXML() ;
ReadXML() ;
ReadXML2() ;
cout << " 结束测试! " << endl ;
return 0 ;
}
int WriteXML()
...{
TiXmlDocument xmlDoc( " test.xml " ); // 建立一个XML文件
TiXmlDeclaration Declaration( " 1.0 " , " gb2312 " , " yes " ); // 声明XML的属性
xmlDoc.InsertEndChild( Declaration ); // 写入基本的XML头结构
TiXmlNode * pNode = NULL;
TiXmlElement * pRootElm = NULL;
TiXmlElement * pChildeElm = NULL;
TiXmlElement * pItemElm = NULL;
TiXmlText * pText = NULL; // 一个指向Text的指针
pText = new TiXmlText( " good " ) ;
pRootElm = new TiXmlElement( " todo " );
pNode = xmlDoc.InsertEndChild( * pRootElm) ;
pRootElm = pNode -> ToElement() ;
pChildeElm = new TiXmlElement( " child1 " ) ;
pChildeElm -> SetAttribute( " num " , 9 ) ;
pNode = pRootElm -> InsertEndChild( * pChildeElm) ;
TiXmlElement * pChildeElm1 = NULL;
pChildeElm1 = pNode -> ToElement() ;
pChildeElm1 -> InsertEndChild( * pText) ;
delete pChildeElm ;
pChildeElm = NULL ;
pChildeElm = new TiXmlElement( " child2 " ) ;
pChildeElm -> SetAttribute( " num " , 10 ) ;
pNode = pRootElm -> InsertBeforeChild (pChildeElm1, * pChildeElm) ;
TiXmlElement * pChildeElm2 = NULL;
pChildeElm2 = pNode -> ToElement() ;
pChildeElm2 -> InsertEndChild( * pText) ;
xmlDoc.Print() ;
xmlDoc.SaveFile(); // 把XML文件写入硬盘
return 0 ;
}
int ReadXML()
...{
cout << endl ;
cout << " 开始read XML " << endl ;
TiXmlDocument xmlDoc( " test.xml " );
xmlDoc.LoadFile() ;
TiXmlElement * xmlRootElement = 0 ;
TiXmlElement * xmlSubElement = 0 ;
TiXmlNode * pNode = NULL;
pNode = xmlDoc.FirstChild( " todo " ) ;
xmlRootElement = pNode -> ToElement() ;
if (xmlRootElement)
...{
pNode = xmlRootElement -> FirstChild( " child1 " ) ;
xmlSubElement = pNode -> ToElement() ;
cout << xmlSubElement -> Value() << endl ;
cout << xmlSubElement -> Attribute( " num " ) << endl ;
cout << xmlSubElement -> GetText() << endl ;
}
else
...{
cout << " 找不到根元素 " << endl ;
}
cout << " 结束read XML " << endl ;
return 0 ;
}
int ReadXML2()
...{
cout << endl ;
cout << " 开始read XML " << endl ;
const char * demoEnd = " <?xml version= " 1.0 " encoding= " gb2312 " standalone= " yes " ?> "
" <todo> "
" <child2 num= " 10 " >good</child2> "
" <child1 num= " 9 " >good</child1> "
" </todo> " ;
TiXmlDocument xmlDoc;
xmlDoc.Parse( demoEnd ) ;
TiXmlElement * xmlRootElement = 0 ;
TiXmlElement * xmlSubElement = 0 ;
TiXmlNode * pNode = NULL;
pNode = xmlDoc.FirstChild( " todo " ) ;
xmlRootElement = pNode -> ToElement() ;
if (xmlRootElement)
...{
pNode = xmlRootElement -> FirstChild( " child1 " ) ;
xmlSubElement = pNode -> ToElement() ;
cout << xmlSubElement -> Value() << endl ;
cout << xmlSubElement -> Attribute( " num " ) << endl ;
cout << xmlSubElement -> GetText() << endl ;
}
else
...{
cout << " 找不到根元素 " << endl ;
}
cout << " 结束read XML " << endl ;
return 0 ;
}