c语言tinyxml使用方法,【C/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中的申明部分,即。

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文件,其他文件一概删除

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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最佳实践

48304ba5e6f9fe08f3fa1abda7d326ab.png

最简单的例子

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

tinyxml@163.com

中国

jsoncpp@gmail.com

美国

48304ba5e6f9fe08f3fa1abda7d326ab.png

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

打印整个XML代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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;

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

读取XML

代码如下:

48304ba5e6f9fe08f3fa1abda7d326ab.png

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;

}

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

写入xml

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

48304ba5e6f9fe08f3fa1abda7d326ab.png

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);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

下载工程

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

unzip tinyxml.zip

cd tinyxml

make

./main

更多操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值