C++ TinyXml操作
2015-05-31 09:39
369 查看
前言
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,我们只需要在头文件中包含 < tinyxml.h>就行了。
写入xml
这里我们将通过xml写入代码操作,写入几乎和conf/school.xml同样内容到conf/school-write.xml,代码如下:
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代码如下:
<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; }www.cdtarena.com 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); }
相关文章推荐
- 给定两个整数,比较出其中大者
- c++基础学习(02PM)
- C语言的数组初始化
- C语言fopen用法
- C++ 的 RTTI
- 标准C++中的string类的用法总结
- 基于DirectX的半球形天空类的C++和C#实现
- C++——类实例化内存的分配和this指针的使用
- DLL的双向头文件
- 由一题讨论C语言中的“指针数组作main函数的形参”即 main(int argc,char *argv[])的使用
- C语言产生随机数
- Unix C语言编程示例
- C/C++&nbsp;函数指针,强制转换示例
- 一个简单的C/C++多线程
- C/C++求完数,小提醒
- C++ 实现杨辉三角
- C/C++用Unicode保存字符并输出
- C/C++素数判断(附exe方便不懂编程…
- C++刷题——线段分割平面
- 渣校ACM历程——番外之蓝桥杯决赛