XML 指可扩展标记语言(EXtensible Markup Language) 。可能你会觉得难理解,但是没什么特别,就是纯文本,也许这有点难以理解,但是 XML 不会做任何事情。XML 被设计用来结构化、存储以及传输信息。下面是 John 写给 George 的便签,存储为 XML:
<note>
<to>George</to>
<from>John</from>
<heading>Reminder</heading>
<body>Don't forget the meeting!</body>
</note>
上面的这条便签具有自我描述性。它拥有标题以及留言,同时包含了发送者和接受者的信息。
但是,这个 XML 文档仍然没有做任何事情。它仅仅是包装在 XML 标签中的纯粹的信息。我们需要编写软件或者程序,才能传送、接收和显示出这个文档。
这里不介绍XML的语法和使用,但是可以说的是XML只是一种数据的保存形式,没有特定的标识符,所以随意性很大,有点类型HTML的语法,相关可以自己到网上查阅。
这里主要讲对XML文档数据的读写。
我们写一个简单的XML文档,用来保存人物的一些信息:
<?xml version="1.0" encoding="UTF 8">
<persons>
<person name="jack" sex ="male" age="20">
<telephone>1343214354</telephone>
<address>Beijing.263</address>
<msn>03213241</msn>
</person>
<person name="tom" sex="male" age="30">
<telephone>1524656465</telephone>
<address>Beijing.110</address>
<msn>13021311</msn>
</person>
<person name="joy" sex="female" age="28">
<telephone>1239187494</telephone>
<address>Fujian.988</address>
<msn>12438902</msn>
</person>
<person name="marry" sex="female" age="27">
<telephone>1536283478</telephone>
<address>Fujian.776</address>
<msn>32480923</msn>
</person>
</persons>
文本中,记录了一个人的名字,性别,年龄,电话,地址,和MSN号码,现在我们需要对这些数据在程序进行读取。
对于XML文档数据的读取,我们需要用一些类库和头文件,常见的有MSXML,TinyXML。这里我们用TinyXML,如果你没有TinyXML的库可以到网上下载或者找我要。
TinyXML有六个文件,TinyXML.h, Tinystr.h, TinyXML..cpp, Tinystr.cpp, TinyXMLerror.cpp, Tinyparser.cpp你只要将这六个文件载入你的工程就可以对其进行引用。
具体操作:
// XMLTest.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "tinystr.h"
#include "tinyxml.h"
#include <Windows.h>
#include <string>
#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;
}
//读取XML所有节点的所有内容.
void ReadAllXml(string& szFileName)
{
CString appPath = GetAppPath();
string seperator = "\\";
string fullPath = appPath.GetBuffer(0) +seperator+szFileName;
//打开XML文本对象
TiXmlDocument *myDocument = new TiXmlDocument(fullPath) ;
myDocument->LoadFile() ;
//为对象创建根元素
TiXmlElement *RootElement = myDocument->RootElement() ;
//创建一个元素对象,用于指向第一个节点
TiXmlElement *person = RootElement->FirstChildElement() ;
//循环遍历根元素
while( person ){
//获取属性ID,若属性不止一个,则需要再进行遍历
TiXmlAttribute *IdAttribute = person->FirstAttribute() ;
while(IdAttribute){
cout<<IdAttribute->Name()<<":"<<IdAttribute->Value()<<endl ;
IdAttribute = IdAttribute->Next() ;}
//获取第一个节点的第一个子元素,Name.
TiXmlElement *NameElement = person->FirstChildElement() ;
cout<<NameElement->Value()<<":"<<NameElement->FirstChild()->Value()<<endl ;
//也可以用,GetText来获得该元素的值
//cout<<NameElement->GetText()<<endl ;
//若用Value.则要指出,值也是该元素的子元素.
//获取第二个子元素,Age.
TiXmlElement *AgeElement = NameElement->NextSiblingElement() ;
cout<<AgeElement->Value()<<":"<<AgeElement->FirstChild()->Value()<<endl ;
cout<<endl ;
person = person->NextSiblingElement() ;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string file = "PersonInfo.XML" ;
ReadAllXml(file) ;
system("pause");
return 0;
}
运行结果:
读出所有的XML信息,你可能会觉得很迷惑,我好想没讲代码是怎么运行,都是什么意思,我注释已经说得很清楚了,当时我读源码时是没有注释的,
那么,如果你能通过没有注释来读懂源码你也许就会理解深一些,如果每次都靠别人给你讲得很详细的话,只会让自己似懂非懂。所以,还是自己研究吧 。
可能你发现,很多程序里面都有XML文档,那么它们都是用来干嘛呢,其实很多时候,它们是用来做界面的,怎么做界面?就是把设计界面需要的一些,
比如控件的大小,位置,需载入的图片,这些信息存放XML中,这样当我们程序封转好后,你想改变程序的界面,只需要改变XML中的数据就可以了,这就是
XML文件让程序具有扩展性的地方之一。