晚上研究了下 TinyXml-2,因为马上要用到它。网上搜了一些资料后,感觉很少有比较实用的描述。所以写这篇文章只为总结下 TinyXml-2 从编译到一个非常简单的样例运行。
编译及使用
我用的是 TinyXml-2.6.2,下载地址:http://sourceforge.net/projects/tinyxml/,下载以后,其默认是用 VS2010 打开的。如图:
可以看到,总共有四个项目,其中下面两个是无用的,如其名字所述(…Test…),仅仅为了测试。上面两个项目编译出来的区别就是是否支持STL。选择“生成->批生成->全选->生成”,如此会对这四个项目全部生成(Release版和Debug版都有)。生成时,可能会有报错,不过放心,仔细看的话会发现全部都是 xmltest.cpp 这个文件中的错误,你用不到它,无需关心。
有些人可能会问,没有 VS2010 怎么办?很简单,比 2010 版本高的,打开时 直接 update 即可。比 2010 低的版本 稍微麻烦点。我以 VS2008 为例。新建一个 Win32 控制台应用程序,在应用向导中选择 空项目+静态库,将如图中的6个文件添加到项目中。
编译时会报“fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include “stdafx.h””?”,很简单,按照提示,在对应的文件一一加上即可,重新编译生成,即可得到 .lib 文件。
那我们如何在项目中如何使用 TinyXml-2 呢?我尝试且成功了两种方法是:一种方法是将上图中的两个 .h 文件(主要是tinyxml.h)和生成的 .lib 文件复制到你的工程目录(和其他 .cpp 文件在一起),将头文件添加到项目,在需要使用TinyXml-2 的地方包含这两个头文件并链接库文件(添加如下代码):
1
|
#pragma comment(lib,"tinyxml.lib")
|
另一种方法就是不用生成的库,直接把上图中的六个文件复制并添加到项目中,也可以。
例程
下面再奉上我看到的一个相当简单的例子,可以向你展示 TinyXml-2 中很简单的一些操作。让你很快对其能有所认识。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
#include "tinyxml.h"
#include "tinystr.h"
#include <iostream>
#include <string>
#pragma comment(lib,"tinyxml.lib")
bool CreateXMLFile(std::string& strFileName)
{
try
{
// 创建一个XML的文档对象。
TiXmlDocument *xmlDocument = new TiXmlDocument();
// 根元素。
TiXmlElement *rootElement = new TiXmlElement("Books");
// 连接到文档对象, 作为根元素
xmlDocument->LinkEndChild(rootElement);
// 创建一个Book元素.
TiXmlElement *bookElement = new TiXmlElement("Book");
// 连接到根元素, 就是根元素的子元素
rootElement->LinkEndChild(bookElement);
// 设置Book元素的属性, 这里是ID。
bookElement->SetAttribute("ID", "1");
// 创建Name元素和Price元素
TiXmlElement *nameElement = new TiXmlElement("Name");
TiXmlElement *priceElement = new TiXmlElement("Price");
// 连接
bookElement->LinkEndChild(nameElement);
bookElement->LinkEndChild(priceElement);
// 设置Name元素和Price元素的值。
TiXmlText *nameValue = new TiXmlText("葵花宝典");
nameElement->LinkEndChild(nameValue);
TiXmlText *priceValue = new TiXmlText("50.00");
priceElement->LinkEndChild(priceValue);
xmlDocument->SaveFile(strFileName.c_str()); // 保存到文件
}
catch(...)
{
return false;
}
return true;
}
bool ReadXMLFile(std::string& szFileName)
{
try
{
// 创建一个XML的文档对象。
TiXmlDocument *xmlDocument = new TiXmlDocument(szFileName.c_str());
// 解析
xmlDocument->LoadFile();
// 获得根元素
TiXmlElement *rootElement = xmlDocument->RootElement();
// 输出根元素名称
std::cout << rootElement->Value() << std::endl;
// 获得第一个节点。
TiXmlElement *firstElement = rootElement->FirstChildElement();
// 获得第一个Person的name节点和age节点和ID属性。
TiXmlElement *nameElement = firstElement->FirstChildElement();
TiXmlElement *priceElement = nameElement->NextSiblingElement();
TiXmlAttribute *IDAttribute = firstElement->FirstAttribute();
// 输出
std::cout << nameElement->FirstChild()->Value() << std::endl;
std::cout << priceElement->FirstChild()->Value() << std::endl;
std::cout << IDAttribute->Value()<< std::endl;
}
catch (...)
{
return false;
}
return true;
}
int main()
{
std::string fileName = ".\\test.xml";
CreateXMLFile(fileName);
ReadXMLFile(fileName);
return 0;
}
|
运行结果:
是不是很好理解?!^^
TinyXml-2 的结构(引自自带文档)
TiXmlBase 是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自 TiXmlBase 类,其中 TiXmlNode 类指的是所有被<…>…<…/>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在 TiXmlNode 的基础上又衍生出这几个类 TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是 xml 中的哪一部分。TiXmlAttribute 类不同于 TiXmlNode,它指的是在尖括号里面的内容,像<… ***=…>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?xml version="1.0" encoding="UTF-8"?>
<phonebook>
<!--one item behalfs one contacted person.-->
<item>
<name>miaomaio</name>
<addr>Shaanxi Xi'an</addr>
<tel>13759911917</tel>
<email>miaomiao@home.com</email>
</item>
<item>
<name>gougou</name>
<addr>Liaoning Shenyang</addr>
<tel>15840330481</tel>
<email>gougou@home.com</email>
</item>
<!--more contacted persons.-->
</phonebook>
|
TiXmlDeclaration 指的是<?xml version=”1.0″ encoding=”UTF-8″?>,
TiXmlComment 指的是<!–one item behalfs one contacted person.–>、 <!–more contacted persons.–>,
TiXmlDocument 指的是整个xml文档,
TiXmlElement 指的是<phonebook>、<item>、<name>、<addr>等等这些节点,
TiXmlText 指的是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,
TiXmlAttribute 指的是<?xml version=”1.0″ encoding=”UTF-8″?>节点中version、encoding,
除此之外就是 TiXmlUnknown。