首页 > 代码库 > VC环境使用XML解析器(TinyXML)编程
VC环境使用XML解析器(TinyXML)编程
我是在VC下编译运行。
1.首先下载TinyXML库的文件,这里给出链接
http://prdownloads.sourceforge.net/tinyxml/tinyxml_2_3_4.zip?download
http://prdownloads.sourceforge.net/tinyxml/tinyxml_2_3_4.zip?download
2.下载后解压这个压缩包,把所有的东西放到一个找的着的地方(比如,E:\开发库\TinyXML)
3.用Visual C++(推荐VC++.NET2003)创建一个新的工程(Win32控制台)
4.在TinyXML的目录里面找到tinystr.h, tinyxml.h, tinystr.cpp, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp六个文件加入到刚刚创建的项目中去
5.打开tinyxml.h, 在第一行加入下面这行:
#define TIXML_USE_STL //标志使用STL的内容
#define TIXML_USE_STL //标志使用STL的内容
6.然后创建一个cpp文件,输入下面的内容:
#include "stdafx.h"#include <iostream>#include <fstream>#include "tinyxml.h"using namespace std; int _tmain(int argc, _TCHAR* argv[]){//原先代码是直接加载XML文件,我作了一下修改,把内容读到字符串后再解析,实际使用时就去掉读取XML文件这一步string filename = "first.xml";//TiXmlDocument* doc = new TiXmlDocument(filename.c_str()); //////////////////////////////////////////////////////////////////////////// 在这里复制文件//////////////////////////////////////////////////////////////////////////std::ifstream ifs(filename.c_str());char buffer[1024];char c, *p = buffer;while(ifs.get(c)){ *p++=c;}*p = 0;ifs.close();////////////////////////////////////////////////////////////////////////// //这里开始从字符串中解析XML//创建TiXmlDocument对象TiXmlDocument* doc = new TiXmlDocument();//解析if(!doc->Parse(buffer)){ cout << doc->ErrorDesc() << endl;}//获取根节点const TiXmlElement* root = doc->RootElement();//循环获取该根节点下面的节点for( const TiXmlNode* child = root->FirstChild(); child; child=child->NextSibling()){ //判断为元素类型并且是staticbox元素,Value()获取该标签的名称 if((child->Type() == TiXmlNode::ELEMENT) && (!strcmp(child->Value(),"staticbox"))) { const TiXmlElement *box = (const TiXmlElement*)child; double px, py, pz; double dx, dy, dz; //获取属性值 std::string mesh; mesh = box->Attribute("mesh"); //继续循环获取子节点相关数据 for(const TiXmlNode *sub_tag = box->FirstChild(); sub_tag; sub_tag = sub_tag->NextSibling() ) { if(sub_tag->Type() == TiXmlNode::ELEMENT) { const TiXmlElement *sub_element = (const TiXmlElement*)sub_tag; if(!strcmp(sub_tag->Value(),"position")) { px = (sub_element->Attribute("x",&px))?px:0.0; py = (sub_element->Attribute("y",&py))?py:0.0; pz = (sub_element->Attribute("z",&pz))?pz:0.0; } else if(!strcmp(sub_tag->Value(),"dimension")) { dx = (sub_element->Attribute("x",&dx))?dx:1.0; dy = (sub_element->Attribute("y",&dy))?dy:1.0; dz = (sub_element->Attribute("z",&dz))?dz:1.0; }else if(!strcmp(sub_tag->Value(),"test")) { //使用GetText()方法来获取该标签的值,如这里获取的是test的值1和2 string temp = sub_element->GetText(); } } } cout << "<StaticBox>\n"; cout << "\tPosition = (" << px << ", " << py << ", " << pz << ")\n"; cout << "\tDimension = (" << dx << ", " << dy << ", " << dz << ")\n\n"; }} delete doc;getchar(); return 0;}
7.然后在项目的文件夹中加入一个xml文件,如下:
<?xml version="1.0" encoding="utf-8" ?><Scene><staticbox mesh="crate.mesh"> <position x="-8" y="2" z="4" /> <dimension x="2" y="4" z="2" /> <test>1</test></staticbox><staticbox mesh="crate.mesh"> <position x="3" y="2" z="4" /> <dimension x="2" y="4" z="2" /> <test>2</test></staticbox></Scene>
8.编译运行
附另一个TinyXML读写XML的例子,此处写XML是直接写入XML文件,如果要使用这里的函数不写入文件而是组织成XML流,需要相应修改代码。代码在VS2005中测试运行成功。
#define TIXML_USE_STL //标志使用STL的内容 #include "stdafx.h"#include <iostream>#include <sstream>#include <fstream>#include "tinyxml.h"using namespace std; int WriteXML() ;int ReadXML() ;//读取内存里的一段XMLint ReadXML2() ; int _tmain(int argc, _TCHAR* 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 ;}
原文地址:http://blog.chinaunix.net/uid-22240661-id-1781609.html
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。