C++|C++ TinyXML解析案例详解
目录
- TinyXML介绍
- TinyXML类说明
- 下载和编译
- 简单的例子
- 读取XML
- 写入xml
- XML删除操作
- XML修改操作
TinyXML介绍 最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
TinyXML类说明 【C++|C++ 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的一些操作。
下载和编译 下载地址:http://sourceforge.net/projects/tinyxml/
工作目录为:
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代码
tinyxml@163.com 中国jsoncpp@gmail.com 美国
想要使用tinyxml,只需要在头文件中包含
读取整个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(); //Studentsfor (; 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 = https://www.it610.com/article/studentContactElement->GetText(); cout << contactType<< " : " << contactValue << std::endl; }} }
写入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); }
XML删除操作
删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、TiXmlDocument的基类
TiXmlNode node; node.Clear();
从A节点上移除子节点B
TiXmlNode nodeA; nodeA. RemoveChild( TiXmlNode* removeThis );
从元素A上移除名字为B的属性
TiXmlAttribute attrA; attrA. RemoveAttribute( const char * name );
XML修改操作
查找内容为
TiXmlNode* lpnode = NULL; lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode); TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute(); //找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的tiattr->SetValue(mfid.c_str());
替换一个节点
TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
到此这篇关于C++ TinyXML解析案例详解的文章就介绍到这了,更多相关C++ TinyXML解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- opencv|opencv C++模板匹配的简单实现
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- Quartz|Quartz 源码解析(四) —— QuartzScheduler和Listener事件监听
- Java内存泄漏分析系列之二(jstack生成的Thread|Java内存泄漏分析系列之二:jstack生成的Thread Dump日志结构解析)
- [源码解析]|[源码解析] NVIDIA HugeCTR,GPU版本参数服务器---(3)
- Android系统启动之init.rc文件解析过程
- c++基础概念笔记
- 小程序有哪些低成本获客手段——案例解析
- Spring源码解析_属性赋值
- Android下的IO库-Okio源码解析(一)|Android下的IO库-Okio源码解析(一) 入门