C++ TinyXml操作(含源码下载)

前言

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

TinyXML介绍

在TinyXML中,根据XML的各种元素来定义了一些类:
TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。 
TiXmlHandler:定义了针对XML的一些操作。

下载和编译

本文运行环境是: Redhat 5.5 + g++version 4.6.1 +  GNU Make 3.81 + tinyxml_2_6_2

下载地址是:http://sourceforge.net/projects/tinyxml/

解压之后得到文件夹tinyxml,tinyxml的头文件和cpp文件,都在这个文件夹,为了我们的管理我们的项目工程,我们还是把tinyxml做一个整理。

由于tinyxml不仅支持Linux编译,同时也支持windows下编译,所以解压之后不仅有h文件,cpp文件,还有vc工程的一些工程文件,这里我们只在Linux上使用,所以只留下h文件和cpp文件,其他文件一概删除

这里我列出整理后的工作目录:

tinyxml/           //工作目录|-- include        //头文件根目录|  |-- tinyxml    //tinyxml头文件,包括tinystr.h tinyxml.h|-- src            //cpp源码文件根目录  |-- tinyxml       //tinyxml源码文件夹,包括tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp  |-- main.cpp   //我们的主函数,调用tinyxml的示例代码  |-- conf            //我们示例中用的xml文件所在的文件夹|-- makefile       //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践

最简单的例子

我们在conf目录下建立student.xml,xml代码如下:

<School name="软件学院">      <Class name = "C++">          <Student name="tinyxml" number="123">              <email>[email protected]</email>              <address>中国</address>                   </Student>          <Student name="jsoncpp" number="456">              <email>[email protected]</email>              <address>美国</address>                   </Student>      </Class>  </School>  

使用tinyxml,我们只需要在头文件中包含 <tinyxml.h>就行了。

打印整个XML代码如下:

void printSchoolXml() {    using namespace std;    TiXmlDocument doc;      const char * xmlFile = "conf/school.xml";       if (doc.LoadFile(xmlFile)) {            doc.Print();      } else {        cout << "can not parse xml conf/school.xml" << endl;    }   }

读取XML

代码如下:

void readSchoolXml() {    using namespace std;    const char * xmlFile = "conf/school.xml";    TiXmlDocument doc;                                  if (doc.LoadFile(xmlFile)) {        doc.Print();    } else {        cout << "can not parse xml conf/school.xml" << endl;        return;    }    TiXmlElement* rootElement = doc.RootElement();  //School元素      TiXmlElement* classElement = rootElement->FirstChildElement();  // Class元素    TiXmlElement* studentElement = classElement->FirstChildElement();  //Students      for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) {        TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute();  //获得student的name属性          for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) {            cout << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;               }                                 

        TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式         for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {            string contactType = studentContactElement->Value();            string contactValue = studentContactElement->GetText();            cout << contactType  << " : " << contactValue << std::endl;                   }   

    } }

写入xml

这里我们将通过xml写入代码操作,写入几乎和conf/school.xml同样内容到conf/school-write.xml,代码如下:

void writeSchoolXml() {    using namespace std;    const char * xmlFile = "conf/school-write.xml";     TiXmlDocument doc;      TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");      TiXmlElement * schoolElement = new TiXmlElement( "School" );      TiXmlElement * classElement = new TiXmlElement( "Class" );      classElement->SetAttribute("name", "C++");

    TiXmlElement * stu1Element = new TiXmlElement("Student");    stu1Element->SetAttribute("name", "tinyxml");    stu1Element->SetAttribute("number", "123");    TiXmlElement * stu1EmailElement = new TiXmlElement("email");    stu1EmailElement->LinkEndChild(new TiXmlText("[email protected]") );    TiXmlElement * stu1AddressElement = new TiXmlElement("address");    stu1AddressElement->LinkEndChild(new TiXmlText("中国"));    stu1Element->LinkEndChild(stu1EmailElement);    stu1Element->LinkEndChild(stu1AddressElement);

    TiXmlElement * stu2Element = new TiXmlElement("Student");    stu2Element->SetAttribute("name", "jsoncpp");    stu2Element->SetAttribute("number", "456");    TiXmlElement * stu2EmailElement = new TiXmlElement("email");    stu2EmailElement->LinkEndChild(new TiXmlText("[email protected]"));    TiXmlElement * stu2AddressElement = new TiXmlElement("address");    stu2AddressElement->LinkEndChild(new TiXmlText("美国"));    stu2Element->LinkEndChild(stu2EmailElement);    stu2Element->LinkEndChild(stu2AddressElement);

    classElement->LinkEndChild(stu1Element);      classElement->LinkEndChild(stu2Element);      schoolElement->LinkEndChild(classElement);  

    doc.LinkEndChild(decl);      doc.LinkEndChild(schoolElement);     doc.SaveFile(xmlFile);  }

下载工程

点击下载

下载之后的编译和运行步骤

unzip tinyxml.zipcd tinyxmlmake./main

更多操作

请参考 http://www.grinninglizard.com/tinyxmldocs/tutorial0.html

时间: 2024-10-25 10:42:44

C++ TinyXml操作(含源码下载)的相关文章

C++ md5操作(含源码下载)

虽然一些C++第三库已经继承了MD5操作,但是有时我们更需要一个轻量的md5库函数,这里提供了一个MD5类,可以传入一个字符串生成md5结果. md5库下载 下载解压后,有md5.h md5.cpp main.cpp三个文件,其中md5.h和md5.cpp是MD5类的头文件和实现文件,main.cpp是测试文件. 编译和运行 g++ md5.cpp main.cpp -o main./main 输出结果: abc md5 is 900150983cd24fb0d6963f7d28e17f72 其

java注解入门(含源码下载)

注解(Annotation)是从jdk1.5开始增加的特性.学习注解能够读懂框架的代码:让编程更加简洁,代码更加清晰. 注解概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法. 注解需要import java.lang.annotation.*; java自带的3个注解: @Override//覆盖 @Deprecated//过时 @SuppressWarnings()//抑制警告 自定义注解的语法要求 一般自定义注解的代码如下://“Description 注解”在下面

手把手教你从最基本的Java工程搭建SpringMVC+SpringDataJPA+Hibernate(含源码下载)

转载请注明出处:http://blog.csdn.net/anxpp/article/details/51415366,谢谢! 本文会介绍从一个最基本的java工程,到Web工程,到集成Spring.SpringMVC.SpringDataJPA+Hibernate. 平时我们可能是通过一个模板搭建一个工程,或者是直接导入一个项目,而本文选择从最基本的java工程开始,目的是为了展示更多原理. 当然,我们还是从一个最基本的Maven工程开始,其实普通的非Maven工程,搭建过程几乎是一模一样的,

17+个ASP.NET MVC扩展点,含源码{转}

1.自定义一个HttpModule,并将其中的方法添加到HttpApplication相应的事件中!即:创建一个实现了IHttpmodule接口的类,并将配置WebConfig.在自定义的HttpModule中,可以将一个方法注册到HttpApplication的任意一个事件中,在之后执行HttpApplication一些列事件时,按照事件的顺序(事件又按照添加方法先后的顺序)执行注册在事件中的方法! namespace MvcStore.Models { public class Excute

【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)

作者 : 韩曙亮 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/51592930 手机的两种模式 : 在下面有详细的图片示例; -- Recovery 模式 : 音量键增加 + 电源键, 长按上述组合键, 看到 "MI" 的 LOGO 后即进入 Recovery 模式; -- Fastboot 模式 : 音量键减小 + 电源键, 长按上述组合键, 看到 "FASTBOOT" 后, 即 进入 FA

h--5--菠菜源码下载java基础概念

1.第一个应用程序:Hello World!package my.xkyy.lsc;public class HelloWorld {public static void main(String[] args) { System.out.println("hello wrold!");}}2.数组:int[] a=new int[100];3.字节(byte):8位二进制数4.UTF-8编码:一个英文字符等于一个字节,h--5--菠菜源码下载QQ:2152876294 网址diguay

微信小程序源码下载(200多个)

微信小程序源码下载汇总,点击标题进入对应的微信小程序下载页面. 最新 demo源码(点击标题进入帖子下载) 描述 1 微信小程序 会议室预定小程序 微信小程序 会议室预定小程序**** 本内容被作者隐藏 **** 2 微信小程序-双人五子棋小游戏 微信小程序-双人五子棋小游戏**** 本内容被作者隐藏 **** 3 打卡签到小程序 用微信小程序实现的一个简单的打卡签到的小程序拒绝 4 微信小程序---左滑删除 微信小程序---左滑删除**** 本内容被作者隐藏 **** 5 一个借钱的记事本的微

自定义ProgressDialog实现暂时隐藏进度值并显示等待状态(附源码下载)

有时,我们需要访问网络才能获取到需要操作的任务数(例如下载的文件数),而在服务器返回任务数之前要想隐藏进度百分比和进度数值,就需要我们自己重写ProgressDialog.等到获取到任务数后再把进度值和百分比显示出来.先上效果图: 关键代码: public class CustomProgressDialog extends ProgressDialog { private final String TAG = this.getClass().getSimpleName(); public Cu

Spring1:Spring简介、环境搭建及源码下载

框架学习前言 这个模块是对于Java框架的学习,主要就是Spring.Hibernate.Ibatis,框架的学习我是这么想的: 1.简单介绍框架,主要是从网上借鉴一些重点 2.尽量说明清楚框架的使用方法以及细节点 3.尽量以自己的理解讲清楚Spring中的一些源代码 Spring是什么 Spring是一款为了解决企业应用开发的复杂性而创建的轻量级Java框架.框架的主要优势之一就是其分层架构,分层架构允许使用者选择哪一个组件,同时为J2EE应用程序开发提供集成的框架.从简单性.可测试性和松耦合