TinyXML2 学习: http://www.tuicool.com/articles/uYBB7j
C++使用tinyxml创建和解析xml文件(本文用于cocos2dx):http://blog.csdn.net/u012234115/article/details/38643259
我是由于工作原因使用的tinyXML,源码是直接由老大提供给我的,与网上流传的不太一样,所以我也不知道下载链接在哪,但是我会在文章末尾附带的源码
TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译,使用TinyXML进行C++ XML解析,使用简单,容易上手。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
在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
<School name="软件学院">
<Class name = "C++">
<Student name="tinyxml" number="123">
<email>[email protected]email>
<address>中国address>
Student>
<Student name="jsoncpp" number="456">
<email>[email protected]email>
<address>美国address>
Student>
Class>
School>
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("[email protected]");
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("[email protected]");
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