体验TinyXML读写XML文件数据

开发
今天我们将谈到如何学习TinyXML,主要是要理解其节点的层次关系,通晓其筋脉,则运用自如。

  前一阵子做一个客服回复玩家问题工具,要用到读写XML文件的数据,同事推荐用TinyXML,于是,开始了我与TinyXML的亲密之旅。

  先简单说说配置:首先下载TinyXML库的文件,然后在 TinyXML 的目录里面找到tinystr.h, tinyxml.h,tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp,tinyxmlparser.cpp六个文件加入到自己的项目中去,在相应的工程文件中加入两个头文件 #include "tinyxml.h" ,#include "tinystr.h",在 tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp四个文件的第一行加入头文件 #include "stdafx.h",然后即可使用TinyXML编程。

  要读取的xml 数据如下:

  1.   <?xml version="1.0" encoding="gb2312" standalone="yes" ?> 
  2.   <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
  3.   <prop> 
  4.   <id>100</id> 
  5.   <title>test 1</title> 
  6.   </prop> 
  7.   <prop> 
  8.   <id>200</id> 
  9.   <title>test 2</title> 
  10.   </prop> 
  11.   </root> 

  注意要将 encoding设为gb2312格式,我一开始设置的是utf-8,结果遇到在程序里

  写入中文没问题, 但在读出该中文时却有异常,把后面的 </ 符号也当作值读出来

  了,后来和一同事讨论后才知道是编码问题。

  1.   string filefullPath = 要读取xml文件的绝对路径  
  2.   //创建文件对象  
  3.   TiXmlDocument * myDocument = new TiXmlDocument(filefullPath.c_str());  
  4.   //加载文件数据  
  5.   myDocument->LoadFile();  
  6.   //获取根节点  
  7.   TiXmlElement *RootElement = myDocument->RootElement(); 

  以下是简单的读取操作:

  1.   //第一个子节点  
  2.   TiXmlElement *CurrentPerson = RootElement->FirstChildElement();  
  3.   //遍历获取指定节点数据  
  4.   while(CurrentPerson)  
  5.   {  
  6.   //子节点第一个属性 id  
  7.   TiXmlElement *IdElement = CurrentPerson->FirstChildElement();  
  8.   //第一个属性的值  
  9.   int nodeID = atoi(IdElement->FirstChild()->Value());  
  10.   //子节点第二个属性 title  
  11.   TiXmlElement *TitleElement = IdElement->NextSiblingElement();  
  12.   //第二个属性的值  
  13.   CString nodeTitle = TitleElement->FirstChild()->Value();  
  14.   .....................  
  15.   如果还有后续节点,依次读取  
  16.   .....................  
  17.   维护读出的数据  
  18.   .....................  
  19.   //指向下一节点  
  20.   CurrentPersonCurrentPerson = CurrentPerson->NextSiblingElement();  
  21.   } 

  以下是增加xml记录的操作,例如要增加 id 为 300,title 为 test3 的记录:

  1.   //创建节点对象  
  2.   TiXmlElement *PersonElement = new TiXmlElement("prop");  
  3.   //链接到根节点  
  4.   RootElement ->LinkEndChild(PersonElement);  
  5.   //创建节点对象的属性节点  
  6.   TiXmlElement *IdElement = new TiXmlElement("id");  
  7.   TiXmlElement *TitleElement =new TiXmlElement("title");  
  8.   //将属性节点链接到子节点  
  9.   PersonElement->LinkEndChild(IdElement);  
  10.   PersonElement->LinkEndChild(TitleElement);  
  11.   //创建属性对应数值对象  
  12.   TiXmlText *idContent = new TiXmlText("300");  
  13.   TiXmlText *titleContent = new TiXmlText("test3");  
  14.   //将数值对象关联到属性节点  
  15.   IdElement->LinkEndChild(idContent);  
  16.   TitleElement->LinkEndChild(titleContent);  
  17.   //保存到文件  
  18.   myDocument->SaveFile(m_filefullPath.c_str()); 

  以下是删除记录操作,例如要删除id为300 的记录:

  1.   //获取当前要删除的节点  
  2.   TiXmlElement * childElement = 根据id从自己读取时缓存的数据中获得  
  3.   //从根节点移除子节点  
  4.   RootElement->RemoveChild(childElement);  
  5.   //保存文件  
  6.   myDocument->SaveFile(m_filefullPath.c_str()); 

  学习TinyXML主要是要理解其节点的层次关系,通晓其筋脉,则运用自如。

原文链接:http://www.cnblogs.com/skydesign/archive/2011/11/08/2240528.html

【编辑推荐】

  1. XML之父解读未来互联网"游戏化"的三个真谛
  2. Ajax和Web服务数据格式:XML SOAP HTML
  3. 超强解析XML——简单直接的来
  4. 解析PHP中的XML数据
  5. 大话HTML DOM与XML DOM的区别与联系
责任编辑:彭凡 来源: 博客园
相关推荐

2013-06-09 10:25:56

Android开发XML读写XML解析

2013-06-09 10:37:53

Android开发XML读写XML解析

2013-06-09 10:18:29

Android开发XML读写XML解析

2013-06-09 11:31:13

Android开发XML读写XML解析

2013-06-09 12:49:15

Android开发XML读写XML解析

2013-06-09 12:53:05

Android开发XML读写XML解析

2013-06-09 13:07:23

Android开发XML读写XML解析

2013-06-09 10:04:35

Android开发XML读写XML解析

2011-04-06 13:56:36

Delphi

2010-01-13 13:57:09

CentOS vsft

2021-11-11 23:16:33

前端数据格式Web

2010-04-16 14:39:45

Oracle数据库

2009-12-09 09:55:39

ibmdwSpring

2021-02-26 20:55:56

JavaNIO随机

2011-10-11 17:07:12

数据库Internet文件数据库

2010-02-05 16:46:58

C++ TinyXml

2021-08-05 10:00:02

Python编程语言

2009-12-18 15:16:49

Ruby on Rai

2010-05-24 14:02:06

MySQL数据库

2010-02-01 10:15:07

C++ TinyXML
点赞
收藏

51CTO技术栈公众号