前言

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>tinyxml@163.com</email>
<address>中国</address>
</Student>
<Student name="jsoncpp" number="456">
<email>jsoncpp@gmail.com</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("tinyxml@163.com") );
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("jsoncpp@163.com"));
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.zip
cd tinyxml
make
./main

更多操作

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

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

  1. 【C/C++开发】TinyXml操作(含源码下载)

    前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手. 这个解析库的模型通过解析XM ...

  2. C++ JsonCpp 使用(含源码下载)

    C++ JsonCpp 使用(含源码下载) 前言 JSON是一个轻量级的数据定义格式,比起XML易学易用,而扩展功能不比XML差多少,用之进行数据交换是一个很好的选择JSON的全称为:JavaScri ...

  3. C# ini文件操作【源码下载】

    介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...

  4. C# 条形码操作【源码下载】

    本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...

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

    注解(Annotation)是从jdk1.5开始增加的特性.学习注解能够读懂框架的代码:让编程更加简洁,代码更加清晰. 注解概念:java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法. ...

  6. python下的orm基本操作(1)--Mysql下的CRUD简单操作(含源码DEMO)

    最近逐渐打算将工作的环境转移到ubuntu下,突然发现对于我来说,这ubuntu对于我这种上上网,收收邮件,写写博客,写写程序的时实在是太合适了,除了刚接触的时候会不怎么完全适应命令行及各种权限管理, ...

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

                 分类: Android 系统开发(5)                                              作者同类文章X 版权声明:本文为博主原创文章 ...

  8. C# Excel导入、导出【源码下载】

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  9. ElasticSearch+Kibana 索引操作( 附源码)

    一 前言 ElasticiSearch 简介 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elastics ...

随机推荐

  1. centos5.2 x86 安装 oracle 11g2r 日志

    一.安装centos 二.安装ora所需的库 三.修改centos内核 四.建用户组和目录结构等 五.安装ora11g2r 六.安装sqlplus的翻页程序和help补丁 七.自启动脚本 八.常用命令 ...

  2. [LeetCode OJ] Max Points on a Line—Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

    //定义二维平面上的点struct Point { int x; int y; Point(, ):x(a),y(b){} }; bool operator==(const Point& le ...

  3. 虾米loop 摇头代码

    .head{ position: absolute; -webkit-animation: shake 1s infinite; -webkit-transform-origin: center bo ...

  4. 转型函数 Boolean()

    布尔值有2种可能的值true和false;但 ECMAScript中所有类型的值都有与这两个 Boolean 值 等价的值.要将一个值转换为其对应的 Boolean 值,可以调用转型函数 Boolea ...

  5. IDA6.6调试安卓程序配置教程

    1.把ida 目录下android_server传到设备的 /data/local/tmp/ cmd执行adb shell 进入模拟器命令行 su cd /data/local/tmp/ chmod ...

  6. phpinfo.php

    ---恢复内容开始--- apache中的配置不对 查看httpd.conf文件中是否有: AddType ...... AddType application/x-httpd-php .php -- ...

  7. JVM笔记-逃逸分析

    参考: http://www.iteye.com/topic/473355http://blog.sina.com.cn/s/blog_4b6047bc01000avq.html 什么是逃逸分析(Es ...

  8. asp.net(C#)写SQL语句技巧

    /*添加SQL*/string fields = "";string values = "";fields += "xm"; values ...

  9. poj 2892 &&hdu 1540 Tunnel Warfare

    http://poj.org/problem?id=2892 #include <cstdio> #include <cstring> #include <algorit ...

  10. poj 2406Power Strings

    http://poj.org/problem?id=2406 #include<cstdio> #include<cstring> #include<algorithm& ...