您的位置:首页 > 其它

TinyXML2开源库使用

2016-05-23 13:41 267 查看

相关文章

TinyXML2 学习http://www.tuicool.com/articles/uYBB7j

C++使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: