TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。
本文所用库文件来自
TinyXML 下载 |SourceForge.nethttps://sourceforge.net/projects/tinyxml/*请注意*TinyXML开发已经停止,所有开发都已转移到TinyXML-2。TinyXML-2 可在https://github.com/leethomason/tinyxml2
将库文件压缩包解压后,即可看到以下文件内容:
其中,核心库文件即为
tinystr.cpp
tinystr.h
tinyxml.cpp
tinyxml.h
tinyxmlerror.cpp
tinyxmlparser.cpp
其他文件是官方给的示例工程文件,如果电脑安装了VS,可以打开tinyxml.sln工程文件,查看官方示例程序。
官方给的示例程序有点复杂。因此,笔者参考了一下各种资料,简单做了些小例子,方便刚使用这个库的同学上手。
首先我们需要了解库中几个重要的对象:
TiXmlDocument:一个XML的文档对象
TiXmlElement:一个元素对象
顾名思义,一个XML文件对应着一个TiXmlDocument;XML文件中每个树节点,对应一个TiXmlElement。一个节点与子节点的连接关系,即一个元素对象和子元素对象的连接关系。
TiXmlElement下有一些方法,能够实现数据的载入和元素之间的连接:
TiXmlNode* TiXmlNode::LinkEndChild( TiXmlNode* node ):元素连接
void TiXmlElement::SetAttribute( const char * cname, const char * cvalue ):设置节点的属性和值
直接上代码
- // tinyxml-test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
- //
-
- #include <iostream>
- #include <stdio.h>
- #include "tinystr.h"
- #include "tinyxml.h"
-
- using namespace std;
-
- void creatXmlFile();
- void ReadXmlFile();
-
- int main()
- {
- creatXmlFile();
- ReadXmlFile();
- }
-
-
- void creatXmlFile()
- {
- TiXmlDocument* myDocument = new TiXmlDocument();
- TiXmlElement* RootElement = new TiXmlElement("Persons");
-
- myDocument->LinkEndChild(RootElement);
- TiXmlElement* PersonElement = new TiXmlElement("Person");
- RootElement->LinkEndChild(PersonElement);
- PersonElement->SetAttribute("ID", "1");
- TiXmlElement* NameElement = new TiXmlElement("name");
- TiXmlElement* AgeElement = new TiXmlElement("age");
- PersonElement->LinkEndChild(NameElement);
- PersonElement->LinkEndChild(AgeElement);
- TiXmlText* NameContent = new TiXmlText("周星星");
- TiXmlText* AgeContent = new TiXmlText("22");
- NameElement->LinkEndChild(NameContent);
- AgeElement->LinkEndChild(AgeContent);
-
- PersonElement = new TiXmlElement("Person");
- RootElement->LinkEndChild(PersonElement);
- PersonElement->SetAttribute("ID", "2");
- NameElement = new TiXmlElement("name");
- AgeElement = new TiXmlElement("age");
- PersonElement->LinkEndChild(NameElement);
- PersonElement->LinkEndChild(AgeElement);
- NameContent = new TiXmlText("周大福");
- AgeContent = new TiXmlText("23");
- NameElement->LinkEndChild(NameContent);
- AgeElement->LinkEndChild(AgeContent);
-
-
- myDocument->SaveFile("info.xml");
- cout << "写入完成 " << endl << endl;
- }
-
-
- void ReadXmlFile()
- {
- //创建一个XML的文档对象。
- TiXmlDocument* myDocument = new TiXmlDocument("info.xml");
- myDocument->LoadFile();
- //获得根元素,即Persons。
- TiXmlElement* RootElement = myDocument->RootElement();
- //输出根元素名称,即输出Persons。
- cout << "根元素标签名:: " << RootElement->Value() << endl;
- //获得第一个Person节点。
- TiXmlElement* FirstPerson = RootElement->FirstChildElement();
- //获得第一个Person的name节点和age节点和ID属性。
- TiXmlElement* NameElement = FirstPerson->FirstChildElement();
- TiXmlElement* AgeElement = NameElement->NextSiblingElement();
- TiXmlAttribute* IDAttribute = FirstPerson->FirstAttribute();
- //输出第一个Person的name内容,即周星星;age内容,即;ID属性,即。
- cout << "子节点标签名:: " << NameElement->Value() << endl;
- cout << "子节点name:: " << NameElement->FirstChild()->Value() << endl;
- cout << "子节点age:: " << AgeElement->FirstChild()->Value() << endl;
- cout << "子节点ID:: " << IDAttribute->Value() << endl;
-
- }
注意工程中要引入库文件:
运行结果:
其实也就是一层一层节点直接的创建,设置,链接。是个非常简单的结构。