博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ TinyXml操作(含源码下载)
阅读量:6502 次
发布时间:2019-06-24

本文共 5014 字,大约阅读时间需要 16 分钟。

前言

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

下载地址是:

解压之后得到文件夹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代码如下:

tinyxml@163.com
中国
jsoncpp@gmail.com
美国

使用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://nomyo.baihongyu.com/

你可能感兴趣的文章
tomcat内存设置
查看>>
Winform基础
查看>>
RS特殊报表样式需求处理
查看>>
yum安装MySQL
查看>>
在Android Studio中使用shareSDK进行社会化分享(图文教程)
查看>>
[翻译]利用C#获取终端服务(Terminal Services)会话的闲置时间
查看>>
20天android学习
查看>>
优化SqlServer--数据压缩
查看>>
VS2010性能监视工具
查看>>
转载:APP的上线和推广——线上推广渠道
查看>>
******IT公司面试题汇总+优秀技术博客汇总
查看>>
Java线
查看>>
poj 1789 Truck History(kruskal算法)
查看>>
HA for openstack
查看>>
更改文件、图片名称思路,我们的名字在以后添加_2等待
查看>>
Android:Notification的生成与取消
查看>>
使用ggbio在R中制作弦图
查看>>
JAVA多线程与并发学习总结
查看>>
【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】
查看>>
采用curl库
查看>>