读取和设置 xml 配置文件是最常用的操作,试用了几个 C++ 的 XML 解析器,个人感觉 TinyXML 是使用起来最舒服的,因为它的 API 接口和 Java 的十分类似,面向对象性很好。
TinyXML 是一个开源的解析 XML 的解析库,能够用于 C++ ,能够在 Windows 或 Linux 中编译。这个解析库的模型通过解析 XML 文件,然后在内存中生成 DOM 模型,从而让我们很方便的遍历这棵 XML 树。
DOM 模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。
如下是一个
XML
片段:
<
Persons
>
<
Person
ID
="1"
>
<
name
>
周星星
</
name
>
<
age
>
20
</
age
>
</
Person
>
<
Person
ID
="2"
>
<
name
>
白晶晶
</
name
>
<
age
>
18
</
age
>
</
Person
>
</
Persons
>
在 TinyXML 中,根据 XML 的各种元素来定义了一些类:
TiXmlBase :整个 TinyXML 模型的基类。
TiXmlAttribute :对应于 XML 中的元素的属性。
TiXmlNode :对应于 DOM 结构中的节点。
TiXmlComment :对应于 XML 中的注释
TiXmlDeclaration :对应于 XML 中的申明部分,即 < ? versiong="1.0" ?> 。
TiXmlDocument :对应于 XML 的整个文档。
TiXmlElement :对应于 XML 的元素。
TiXmlText :对应于 XML 的文字部分
TiXmlUnknown :对应于 XML 的未知部分。
TiXmlHandler :定义了针对 XML 的一些操作。
TinyXML 是个解析库,主要由 DOM 模型类( TiXmlBase 、 TiXmlNode 、 TiXmlAttribute 、 TiXmlComment 、 TiXmlDeclaration 、 TiXmlElement 、 TiXmlText 、 TiXmlUnknown )和操作类( TiXmlHandler )构成。它由两个头文件( .h 文件)和四个 CPP 文件( .cpp 文件)构成,用的时候,只要将( tinyxml.h 、 tinystr.h 、 tinystr.cpp 、 tinyxml.cpp 、 tinyxmlerror.cpp 、 tinyxmlparser.cpp )导入工程就可以用它的东西了。如果需要,可以将它做成自己的 DLL 来调用。举个例子就可以说明一切。。。
对应的
XML
文件:
<
Persons
>
<
Person
ID
="1"
>
<
name
>
phinecos
</
name
>
<
age
>
22
</
age
>
</
Person
>
</
Persons
>
读写
XML
文件的程序代码:
#include
<
iostream
>
#include
"
tinyxml.h
"
#include
"
tinystr.h
"
#include
<
string
>
#include
<
windows.h
>
#include
<
atlstr.h
>
using
namespace
std;
CString GetAppPath()
{
//
获取应用程序根目录
TCHAR modulePath[MAX_PATH];
GetModuleFileName(NULL, modulePath, MAX_PATH);
CString strModulePath(modulePath);
strModulePath
=
strModulePath.Left(strModulePath.ReverseFind(_T(
'
//
'
)));
return
strModulePath;
}
bool
CreateXmlFile(
string
&
szFileName)
{
//
创建xml文件,szFilePath为文件保存的路径,若创建成功返回true,否则false
try
{
//
创建一个XML的文档对象。
TiXmlDocument
*
myDocument
=
new
TiXmlDocument();
//
创建一个根元素并连接。
TiXmlElement
*
RootElement
=
new
TiXmlElement(
"
Persons
"
);
myDocument
->
LinkEndChild(RootElement);
//
创建一个Person元素并连接。
TiXmlElement
*
PersonElement
=
new
TiXmlElement(
"
Person
"
);
RootElement
->
LinkEndChild(PersonElement);
//
设置Person元素的属性。
PersonElement
->
SetAttribute(
"
ID
"
,
"
1
"
);
//
创建name元素、age元素并连接。
TiXmlElement
*
NameElement
=
new
TiXmlElement(
"
name
"
);
TiXmlElement
*
AgeElement
=
new
TiXmlElement(
"
age
"
);
PersonElement
->
LinkEndChild(NameElement);
PersonElement
->
LinkEndChild(AgeElement);
//
设置name元素和age元素的内容并连接。
TiXmlText
*
NameContent
=
new
TiXmlText(
"
周星星
"
);
TiXmlText
*
AgeContent
=
new
TiXmlText(
"
22
"
);
NameElement
->
LinkEndChild(NameContent);
AgeElement
->
LinkEndChild(AgeContent);
CString appPath
=
GetAppPath();
string
seperator
=
"
//
"
;
string
fullPath
=
appPath.GetBuffer(
0
)
+
seperator
+
szFileName;
myDocument
->
SaveFile(fullPath.c_str());
//
保存到文件
}
catch
(
string
&
e)
{
return
false
;
}
return
true
;
}
bool
ReadXmlFile(
string
&
szFileName)
{
//
读取Xml文件,并遍历
try
{
CString appPath
=
GetAppPath();
string
seperator
=
"
//
"
;
string
fullPath
=
appPath.GetBuffer(
0
)
+
seperator
+
szFileName;
//
创建一个XML的文档对象。
TiXmlDocument
*
myDocument
=
new
TiXmlDocument(fullPath.c_str());
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
->
FirstChild()
->
Value()
<<
endl;
cout
<<
AgeElement
->
FirstChild()
->
Value()
<<
endl;
cout
<<
IDAttribute
->
Value()
<<
endl;
}
catch
(
string
&
e)
{
return
false
;
}
return
true
;
}
int
main()
{
string
fileName
=
"
info.xml
"
;
CreateXmlFile(fileName);
ReadXmlFile(fileName);
}
转载自:http://www.cnblogs.com/phinecos/archive/2008/03/11/1100912.html
1565

被折叠的 条评论
为什么被折叠?



