体验TinyXML读写XML文件数据
前一阵子做一个客服回复玩家问题工具,要用到读写XML文件的数据,同事推荐用TinyXML,于是,开始了我与TinyXML的亲密之旅。 先简单说说配置:首先下载TinyXML库的文件,然后在 TinyXML 的目录里面找到tinystr.h, tinyxml.h,tinystr.cpp,tinyxml.cpp, tinyxmlerror.cpp,tinyxmlparser.cpp六个文件加入到自己的项目中去,在相应的工程文件中加入两个头文件 #include "tinyxml.h" ,#include "tinystr.h",在 tinystr.cpp,tinyxml.cpp,tinyxmlerror.cpp,tinyxmlparser.cpp四个文件的第一行加入头文件 #include "stdafx.h",然后即可使用TinyXML编程。 要读取的xml 数据如下:
注意要将 encoding设为gb2312格式,我一开始设置的是utf-8,结果遇到在程序里 写入中文没问题, 但在读出该中文时却有异常,把后面的 了,后来和一同事讨论后才知道是编码问题。
以下是简单的读取操作:
以下是增加xml记录的操作,例如要增加 id 为 300,title 为 test3 的记录:
以下是删除记录操作,例如要删除id为300 的记录:
学习TinyXML主要是要理解其节点的层次关系,通晓其筋脉,则运用自如。 C++ TinyXml操作(含源码下载)
前言 TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。 TinyXML介绍 在TinyXML中,根据XML的各种元素来定义了一些类: 下载和编译本文运行环境是: Redhat 5.5 + g++version 4.6.1 + GNU Make 3.81 +tinyxml_2_6_2 下载地址是:http://sourceforge.net/projects/tinyxml/ 解压之后得到文件夹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=jsoncpp456"> <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() {
namespace std;
";
TiXmlDocument doc;
if (doc.LoadFile(xmlFile)) {
doc.Print();
} " << 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() {
conf/school-write.xml";
TiXmlDocument doc;
TiXmlDeclaration * decl = new TiXmlDeclaration(1.0","",0); line-height:1.5!important">"");
TiXmlElement * schoolElement = new TiXmlElement( School" );
TiXmlElement * classElement = Class" );
classElement->SetAttribute(name");
TiXmlElement * stu1Element = new TiXmlElement(Student");
stu1Element->SetAttribute(number");
TiXmlElement * stu1EmailElement = email");
stu1EmailElement->LinkEndChild(new TiXmlText(tinyxml@163.com") );
TiXmlElement * stu1AddressElement = address");
stu1AddressElement->LinkEndChild(中国"));
stu1Element->LinkEndChild(stu1EmailElement);
stu1Element->LinkEndChild(stu1AddressElement);
TiXmlElement * stu2Element = ");
stu2Element->SetAttribute(");
TiXmlElement * stu2EmailElement = ");
stu2EmailElement->LinkEndChild(jsoncpp@163.com"));
TiXmlElement * stu2AddressElement = ");
stu2AddressElement->LinkEndChild(美国"));
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://www.grinninglizard.com/tinyxmldocs/tutorial0.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |