晚上研究了下 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。