前言

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/C++开发】TinyXml操作(含源码下载)的更多相关文章

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

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

  2. 基于Android开发的天气预报app(源码下载)

    原文:基于Android开发的天气预报app(源码下载) 基于AndroidStudio环境开发的天气app -系统总体介绍:本天气app使用AndroidStudio这个IDE工具在Windows1 ...

  3. Harmony OS 开发避坑指南——源码下载和编译

    Harmony OS 开发避坑指南--源码下载和编译 本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(Hi3516,Hi3518和Hi3861)的编译环境,以及如何将源码编译为三个 ...

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

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

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

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

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

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

  7. 【持久化框架】SpringMVC+Spring4+Mybatis3集成,开发简单Web项目+源码下载

    上篇博文我们介绍了mybatis的基本概念与原理,这篇博文我们通过Spring与Mybatis集成,开发一个简单用户增删改查的Web项目. 基本准备工作 1.安装JDK1.6以上版本,安装与配置 2. ...

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

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

  9. Qt项目开发实例 (含源码)

    源码传送门: 啊渊 / QT博客案例 · GitCode 目前QT的研发都是基于windows操作系统的,本文分享在国产操作系统中学QT的路线图,其实学习路线差不多,为了全面的回顾自己的学习知识,打算 ...

随机推荐

  1. treegrid 折叠全部节点

    $(".easyui-treegrid").treegrid({ url: '@Url.Action("GetDataDictionaryList", &quo ...

  2. hdu1171&&P2000——母函数

    hdu1171 题意:有 $n$ 种设施,每种有价值 $v_i$ 和数量 $m_i$,求一种方案使得分成价值尽可能相近的两组.($n \leq 50, v_i \leq 50, m_i \leq 10 ...

  3. web api 2.0 上传文件超过4M时,出现404错误

    客户端代码 string path = "C:\\text.txt"; WebClient client = new WebClient(); Uri _address = new ...

  4. (实例2) TFT2.0液晶屏幕测试 mega2560

    关键修改 针对mega2560板子 #define TFT_RST A4 #define TFT_RS A3 #define TFT_CS A5 // SS #define TFT_SDI A2 // ...

  5. [Javascript] Use requestIdleCallback to schedule JavaScript tasks at an optimal time

    JavaScript is single-threaded, which can present some problems when creating an interactive user exp ...

  6. LeetCode 1143. Longest Common Subsequence

    原题链接在这里:https://leetcode.com/problems/longest-common-subsequence/ 题目: Given two strings text1 and te ...

  7. 【转载】Visual Studio(VS) F12 查看DLL源代码

    https://www.cnblogs.com/zhaoqingqing/p/6751757.html esharper官网:https://www.jetbrains.com/resharper/ ...

  8. HTML音乐标签和滚动

    <!-- 音乐标签 --> <embed src="1.mp3" type=""> <embed src="1.mp3& ...

  9. 开源项目 04 PdfSharp

    using PdfSharp.Drawing; using PdfSharp.Pdf; using System; using System.Collections.Generic; using Sy ...

  10. MongoDB---如何避免插入重复数据(pymongo)

    以下摘自pymongo文档: update_one(filter, update, upsert=False) update_many(filter, update, upsert=False) fi ...