稻草人的程序之路--XML文档数据的遍历

来源:互联网 发布:网络主持人是做什么 编辑:程序博客网 时间:2024/06/05 05:08

 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文件让程序具有扩展性的地方之一。



原创粉丝点击