分享

tinyxml入门教程2

 李林侠图书馆 2012-03-21
tinyxml入门教程2---怎样傻瓜式的截取信息?
2010年10月29日 星期五 下午 1:37

调用的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:源代码已上传至邮箱,即取即用


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约