调用的tinyxml类库,和API一样,只需了解这样用即可
什么是根结点:
// tinyxmltest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "tinyxml.h"
#include "string"
#include <iostream>
#include <fstream> //一定要用此头文件,否则提示错误
//#include <ifstream> //用此头文件会提示错误:“ifstream”: No such file or directory
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////
//功能:模拟出一个,从内存缓冲区buffer里解析XML文件中的信息,并保存为xml文件
//
//第1步:首先从电脑读取xml文件到buffer缓冲区里
//第2步:用tinyxml文件解析信息
//第3步:保存为.xml文件
////////////////////////////////////////////////////////////////////////////////////////////
int _tmain(int argc, _TCHAR* argv[])
{
cout << "开始测试!" <<endl;
////////////////////////////////////////第1步////////////////////////////////////////
cout<<"运行第1步:-----------------------------------------------\n";
string filename ="first.xml";////默认位置是当前工程目录下
std::ifstream ifs(filename.c_str());
char buffer[1024000]; //注:此内存一定要足够大,至少比存进来的数据大即可
char c, *p = buffer;
while(ifs.get(c)) //类似getc
{
*p++=c;
}
*p = 0;
ifs.close(); //关闭缓冲流
cout<<buffer+3<<endl;//针对原作者的输出时前几个会乱码,的解决方法.方法是内存指针向后移几位,针对是针对,不要乱用,大众的还是直接buffer
// cout<<buffer<<endl; //此处是源码
////////////////////////////////////////第2步////////////////////////////////////////
cout<<"运行第2步:-----------------------------------------------\n";
//步骤2-1:------>用tinyxml解析出buffer内的信息
TiXmlDocument* doc = new TiXmlDocument(); //创建TiXmlDocument对象
if(!doc->Parse(buffer))//解析内存缓冲区的信息给doc调用----------------------傻瓜式的,知道此函数这么调用即可,后面就不重复说明了
{cout << doc->ErrorDesc() << endl;}//如果解析错误,则输出错误信息
const TiXmlElement* root = doc->RootElement(); //获取根节点,即<Scene>
for( const TiXmlNode* child = root->FirstChild();child;child=child->NextSibling())//循环获取该根节点下面的节点,参数2代表child为真,即有值时才会运行,否则退出
{
//判断为元素类型并且是staticbox元素,Value()获取该标签的名称
if((child->Type() == TiXmlNode::ELEMENT) && (!strcmp(child->Value(),"staticbox")))
{
double px, py, pz;double dx, dy, dz;
const TiXmlElement *box = (const TiXmlElement*)child; //把child指针传给box一份,让box来处理
//获取属性值
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<<"111111111111111:"<<temp<<endl;//这一步能找到test结点的值
}
}
}
//输出部分
cout << "<StaticBox>\n";
cout << "\tPosition = (" << px << ", " << py << ", " << pz << ")\n";
cout << "\tDimension = (" << dx << ", " << dy << ", " << dz << ")\n\n";
}
}
delete doc;
////////////////////////////////////////第3步////////////////////////////////////////
cout<<"运行第3步:-----------------------------------------------\n";
cout << "结束测试!" << endl ;
system("pause");
return 0;
}
附注1:源代码已上传至邮箱,即取即用