文章分类

站点统计

  • 分类总数: 13 个
  • 文章总数: 145 篇
  • 评论总数: 47 条
  • 附件总数: 59 个
  • 建站日期: 2008-08-18
  • 访问总数: 472870 人次
  • RSS订阅: 文章|评论

TinyXML的使用

Admin 于 2008-09-20 01:53:06 发表C/C++

订阅: http://www.kaiyuan8.org/Feed/Article_86.aspx
引用: 点这里获取地址 (UTF-8)
TinyXML学习[1] < TinyXML的使用 > TinyXML使用笔记与总结

1.首先下载TinyXML库的文件,这里给出链接
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的内容
6.然后创建一个cpp文件,输入下面的内容:

  1. #include <iostream> 
  2. #include <fstream> 
  3. #include "tinyxml.h" 
  4. using namespace std; 
  5. int _tmain(int argc, _TCHAR* argv[]) 
  6. //原先代码是直接加载XML文件,我作了一下修改,把内容读到字符串后再解析,实际使用时就去掉读取XML文件这一步 
  7. string filename = "first.xml"
  8. //TiXmlDocument* doc = new TiXmlDocument(filename.c_str()); 
  9.      ////////////////////////////////////////////////////////////////////////// 
  10. // 在这里复制文件 
  11. ////////////////////////////////////////////////////////////////////////// 
  12. std::ifstream ifs(filename.c_str()); 
  13. char buffer[1024]; 
  14. char c, *p = buffer; 
  15. while(ifs.get(c)) 
  16. *p++=c; 
  17. *p = 0; 
  18. ifs.close(); 
  19. ////////////////////////////////////////////////////////////////////////// 
  20. //这里开始从字符串中解析XML 
  21. //创建TiXmlDocument对象 
  22. TiXmlDocument* doc = new TiXmlDocument(); 
  23. //解析 
  24. if(!doc->Parse(buffer)) 
  25. cout << doc->ErrorDesc() << endl; 
  26. //获取根节点 
  27. const TiXmlElement* root = doc->RootElement(); 
  28. //循环获取该根节点下面的节点 
  29. forconst TiXmlNode* child = root->FirstChild(); 
  30. child; 
  31. child=child->NextSibling()) 
  32. //判断为元素类型并且是staticbox元素,Value()获取该标签的名称 
  33. if((child->Type() == TiXmlNode::ELEMENT) && (!strcmp(child->Value(),"staticbox"))) 
  34.    const TiXmlElement *box = (const TiXmlElement*)child; 
  35.    double px, py, pz; 
  36.    double dx, dy, dz; 
  37. //获取属性值 
  38.    std::string mesh; 
  39.    mesh = box->Attribute("mesh"); 
  40. //继续循环获取子节点相关数据 
  41.    for(const TiXmlNode *sub_tag = box->FirstChild(); sub_tag; sub_tag = sub_tag->NextSibling() ) 
  42.    { 
  43.     if(sub_tag->Type() == TiXmlNode::ELEMENT) 
  44.     { 
  45.      const TiXmlElement *sub_element = (const TiXmlElement*)sub_tag; 
  46.      if(!strcmp(sub_tag->Value(),"position")) 
  47.      { 
  48.       px = (sub_element->Attribute("x",&px))?px:0.0; 
  49.       py = (sub_element->Attribute("y",&py))?py:0.0; 
  50.       pz = (sub_element->Attribute("z",&pz))?pz:0.0; 
  51.      } 
  52.      else if(!strcmp(sub_tag->Value(),"dimension")) 
  53.      { 
  54.       dx = (sub_element->Attribute("x",&dx))?dx:1.0; 
  55.       dy = (sub_element->Attribute("y",&dy))?dy:1.0; 
  56.       dz = (sub_element->Attribute("z",&dz))?dz:1.0; 
  57.      } 
  58. else if(!strcmp(sub_tag->Value(),"test")) 
  59.      { 
  60.          //使用GetText()方法来获取该标签的值,如这里获取的是test的值1和2 
  61.          //string temp = sub_element->GetText();这里有些错,所以注释去  
  62.     } 
  63.     } 
  64.    } 
  65.    cout << "<StaticBox>\n"
  66.    cout << "\tPosition = (" << px << ", " << py << ", " << pz << ")\n"
  67.    cout << "\tDimension = (" << dx << ", " << dy << ", " << dz << ")\n\n"
  68. delete doc; 
  69. getchar(); 
  70.      return 0; 

7.然后在项目的文件夹中加入一个xml文件,取名为first.xml,如下:

  1. <?xml version="1.0" encoding="utf-8" ?> 
  2. <Scene> 
  3. <staticbox mesh="crate.mesh"> 
  4. <position x="-8" y="2" z="4" /> 
  5. <dimension x="2" y="4" z="2" /> 
  6. <test>1</test> 
  7. </staticbox> 
  8. <staticbox mesh="crate.mesh"> 
  9. <position x="3" y="2" z="4" /> 
  10. <dimension x="2" y="4" z="2" /> 
  11. <test>2</test> 
  12. </staticbox> 
  13. </Scene> 

8.编译运行
 

被阅1090次, 0投一票TinyXML
  • 看完了要说点啥么?
  • 昵称 (不填说不了话)
  • 信箱地址 (不会被公开,但是不填也说不了话)
  • 网址 (这个不填也成)
Powered by MiniBoke v2.0.0.8 Build 0828

Copyright © 2008 开源吧!. All rights reserved.

粤ICP备07500939号