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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值