TinyXML2开源库使用
2016-05-23 13:41
267 查看
相关文章
TinyXML2 学习: http://www.tuicool.com/articles/uYBB7jC++使用tinyxml创建和解析xml文件(本文用于cocos2dx):/article/2241354.html
声明
我是由于工作原因使用的tinyXML,源码是直接由老大提供给我的,与网上流传的不太一样,所以我也不知道下载链接在哪,但是我会在文章末尾附带的源码
前言
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。 这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。 DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
TinyXML介绍
在TinyXML中,根据XML的各种元素来定义了一些类: XmlBase:整个TinyXML模型的基类。 XmlAttribute:对应于XML中的元素的属性。 XmlNode:对应于DOM结构中的节点。 XmlComment:对应于XML中的注释。 XmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。 XmlDocument:对应于XML的整个文档。 XmlElement:对应于XML的元素。 XmlText:对应于XML的文字部分。 XmlUnknown:对应于XML的未知部分。 XmlHandler:定义了针对XML的一些操作。
应用实例
通过对下面这个XML进行创建,读取来熟悉API
<?xml version="1.0"?> <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>
创建XML
bool createXML() { XMLDocument *doc = new XMLDocument; XMLDeclaration *declaration = doc->NewDeclaration("xml version=\"1.0\" encoding=\"GBK\""); doc->LinkEndChild(declaration); XMLElement *eleSchool = doc->NewElement("School"); doc->LinkEndChild(eleSchool); eleSchool->SetAttribute("name", "软件学院"); //设置属性 XMLElement *eleClass = doc->NewElement("Class"); eleSchool->LinkEndChild(eleClass); //挂在School节点上 eleClass->SetAttribute("name", "C++"); //------------------------------第一个学生 XMLElement *eleStudent = doc->NewElement("Student"); eleClass->LinkEndChild(eleStudent); //挂在School节点上 //可以设置多个属性 eleStudent->SetAttribute("name", "tinyxml"); eleStudent->SetAttribute("number", 123); XMLElement *eleEmail = doc->NewElement("email"); eleStudent->LinkEndChild(eleEmail); XMLText *texEmail = doc->NewText("tinyxml@163.com"); eleEmail->LinkEndChild(texEmail); XMLElement *eleAddress = doc->NewElement("address"); eleStudent->LinkEndChild(eleAddress); XMLText *texAddress = doc->NewText("中国"); eleAddress->LinkEndChild(texAddress); //------------------------------第二个学生 XMLElement *eleStudent1 = doc->NewElement("Student"); eleClass->LinkEndChild(eleStudent1); //挂在School节点上 eleStudent1->SetAttribute("name", "jsoncpp"); eleStudent1->SetAttribute("number", 456); XMLElement *eleEmail1 = doc->NewElement("email"); eleStudent1->LinkEndChild(eleEmail1); XMLText *texEmail1 = doc->NewText("jsoncpp@gmail.com"); eleEmail1->LinkEndChild(texEmail1); XMLElement *eleAddress1 = doc->NewElement("address"); eleStudent1->LinkEndChild(eleAddress1); XMLText *texAddress1 = doc->NewText("美国"); eleAddress1->LinkEndChild(texAddress1); if (XML_SUCCESS != doc->SaveFile("e:/tmp.xml")) { delete doc; return false; } doc->SaveFile("e:/tmp.xml"); delete doc; return true; }
读取
bool ReadXml() { XMLDocument doc; if (XML_SUCCESS != doc.LoadFile("e:/tmp.xml")) //加载XML失败 返回false { return false; } XMLElement *eleSchool = doc.RootElement(); //获取根节点 if (eleSchool) { cout << "School:" << eleSchool->Attribute("name") << endl; XMLElement* eleClass = eleSchool->FirstChildElement("Class"); while (eleClass) { cout << " Class:" << eleClass->Attribute("name") << endl; XMLElement* eleStudent = eleClass->FirstChildElement("Student"); while (eleStudent) { cout << " Student:" << eleStudent->Attribute("name") << ", " << eleStudent->Attribute("number") << endl; XMLElement* eleEmail = eleStudent->FirstChildElement("email"); if (eleEmail) { cout << " Email:" << eleEmail->GetText() << endl; } XMLElement* eleAddress = eleStudent->FirstChildElement("address"); if (eleAddress) { cout << " Address:" << eleAddress->GetText() << endl; } eleStudent = eleStudent->NextSiblingElement("Student"); } eleClass = eleClass->NextSiblingElement(); } } }
XMLDocument::Parse( const char* p, size_t len ) 这个函数可以直接解析XML格式的字符串 FirstChildElement(const char* value=0):获取第一个值为value的子节点,value默认值为空,则返回第一个子节点。 RootElement():获取根节点,相当于FirstChildElement的空参数版本; const XMLAttribute* FirstAttribute() const:获取第一个属性值; XMLHandle NextSiblingElement( const char* _value=0 ) :获得下一个节点。
下载地址
链接: http://pan.baidu.com/s/1pKDiU4V 密码: ea72
相关文章推荐
- linux 下各个工具使用(screen、tmux,pyenv、virtualenv,pip国内源,tree)
- OpenCV FileStorage 使用记录
- gitflow 在windows下的安装方法
- Jackson - Date Handling
- SSH框架优势
- java 第2个网页
- Ratingbar UseGuide
- Linux系统下init进程的前世今生
- Android 关机实现
- Docker简明教程
- 如何撰写论文
- block,inline和inline-block概念和区别
- http://www.vaikan.com/docs/jquery.form.plugin/jquery.form.plugin.html#getting-started
- Python实现C代码统计工具(二)
- opencv-ios开发笔记2 直方图
- Android Volley框架进行网络通讯
- python 做验证码识别 tesseract
- WPF有水印的TextBox(WaterMark)
- WPF有水印的TextBox(WaterMark)
- iOS 第三方管理库管理 CocoaPods