tinyxml入门教程3---怎样随意截取XML中的信息?---注:是从内存缓冲区截取的,...
注:入门教程2毕竟是别人写好的,但是现在要讲的是删除别人写的,写一个符合自己的XML解析,现看下效果图
同样是test,但是它只截取record层的test,可参照图来看
--------------------------源代码---------------------
// 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(),"play-ground-rank-previous-ten")))
{
/////////////////////////////////////////////解析出第2层
for( const TiXmlNode* child1 =child->FirstChild();child1;child1=child1->NextSibling())//循环获取该根节点下面的节点,参数2代表child为真,即有值时才会运行,否则退出
{//解析第2层注意事项:1.第2层肯定要在第1层中 2.第2层写法与第1层一样,即类似上一行代码,其它没什么了,一样
//判断为元素类型并且是staticbox元素,Value()获取该标签的名称
if((child1->Type() ==TiXmlNode::ELEMENT) &&(!strcmp(child1->Value(),"record")))
{
const TiXmlElement *box = (constTiXmlElement*)child1; //把child指针传给box一份,让box来处理
//继续循环获取子节点相关数据
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(),"test"))
{
//使用GetText()方法来获取该标签的值,如这里获取的是test的值1和2
string temp =sub_element->GetText();
cout<<"111111111111111:"<<temp<<endl;//这一步能找到test结点的值
}
}
}
//输出部分
}
}
////////////////////////////////////////////////解析出第2层结束
}
}
delete doc;
////////////////////////////////////////第3步////////////////////////////////////////
cout<<"运行第3步:-----------------------------------------------\n";
cout << "结束测试!" << endl ;
system("pause");
return 0;
}
注:入门教程2毕竟是别人写好的,但是现在要讲的是删除别人写的,写一个符合自己的XML解析,现看下效果图
同样是test,但是它只截取record层的test,可参照图来看
--------------------------源代码---------------------
// 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(),"play-ground-rank-previous-ten")))
{
/////////////////////////////////////////////解析出第2层
for( const TiXmlNode* child1 =child->FirstChild();child1;child1=child1->NextSibling())//循环获取该根节点下面的节点,参数2代表child为真,即有值时才会运行,否则退出
{//解析第2层注意事项:1.第2层肯定要在第1层中 2.第2层写法与第1层一样,即类似上一行代码,其它没什么了,一样
//判断为元素类型并且是staticbox元素,Value()获取该标签的名称
if((child1->Type() ==TiXmlNode::ELEMENT) &&(!strcmp(child1->Value(),"record")))
{
const TiXmlElement *box = (constTiXmlElement*)child1; //把child指针传给box一份,让box来处理
//继续循环获取子节点相关数据
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(),"test"))
{
//使用GetText()方法来获取该标签的值,如这里获取的是test的值1和2
string temp =sub_element->GetText();
cout<<"111111111111111:"<<temp<<endl;//这一步能找到test结点的值
}
}
}
//输出部分
}
}
////////////////////////////////////////////////解析出第2层结束
}
}
delete doc;
////////////////////////////////////////第3步////////////////////////////////////////
cout<<"运行第3步:-----------------------------------------------\n";
cout << "结束测试!" << endl ;
system("pause");
return 0;
}