### 使用 XML 进行数据存储与备份的实现(1)

XML(eXtensible Markup Language,可扩展标记语言)作为一种数据标记语言正在不断引起人们的关注,XML 的可扩展性已经受到了越来越多的人的关注，特别是在跨平台的数据交换当中，XML 技术的运用可以轻松的解决这个问题.越来越多的企业宣布将在他们的产品中增加对 XML 的支持，Microsoft 未来的发展战略.net 的实现也是完全基于 XML 语言，由此可见，XML 将在今后的数据传输和交换发展中占据越来越重要的作用。
XML 简介
谈到 XML 就不能不提 HTML,HTML 语言的出现推动了互联网的普及.在 XML 诞生之初甚至现在，也有好多人有这样一种误解 XML 将完全取代 HTML，其实，完全不是这样的。 同 HTML 一样， XML 是 SGML (Standard Generalized Markup Language, 通用标识语言标准)的一个子集，它是描述网络上的数据内容和结构的标准。尽管如此，两这之间还是有很大的差别的。
XML 不象 HTML，HTML 仅仅提供了在页面上显示信息的通用方法(没有上下文相关和动态功能) ，XML 则对数据赋予上下文相关功能，它继承了 SGML 的大部分功能，却使用了不太复杂的技术。因此我们要明白 XML 不是 HTML 的一种替代品.在将来最可能的是网站开发者使用 XML 来描述网站所需数据和网站的结构,而 HTML 将用来格式化和显示这些数据.
XML 不是 HTML 的替代品，两者的用途是不同的，XML 是被设计用来描述数据和定焦与数据是什么，而 HTML 是被设计用来显示数据和定焦与数据是什么样子的。XML 是基于数据的语言，是关于如何描述信息的，它只关注与内容，而 HTML 是关于如何显示信息的, 它更关注于样式.，传统的 HTML 对内容的支持非常简单，这就是设计大型 WEB 网站的时候，一定要使用数据库，因为 HTML 无法提供对大量内容的支持。
另外，也是非常重要的是 XML 是可扩展的，在 HTML 中所有的标志(tags)和文档结构都是预先定义好了的，我们必须使用那些标准的 HTML 标志，XML 允许我们自定义自己的标志和自己的文档结构.
怎样用 XML 存储和备份数据
其实，通过前面的介绍，相信大家应该明白了为什么要使用 XML 来进行数据存储和备份了。
传统的数据库存储大都是通过数据库来实现的，数据库的出现给我们带来了很大的便利，提供的快速的信息搜索查询方式，但是数据库也给我们带来了一些不便，现在数据库系统特别的多，像 Oracle,Sql Server,Linux 下的自由软件 MYsql 等,他们各自有不同的标准，并且存在于不同的操作系统，以往要在他们之间交换数据尽管可行，但是非常困难，其实通过 XML 可以很轻松的实现。
XML 在数据库应用方面可以有以下用途:
1、 备份数据库
使用 XML 来备份数据库可以灵活的将数据库中的信息转移到其他的平台和数据库系统中，而且备份数据库占用的空间也非常小，在 MicroSoft 的 Sql Server2000 中已经提供了对 XML 强大的支持，它通过 For XML 来将数据库中的记录导出为 XML 格式，可以通过 Open Xml 将数据从 XML 中导入到数据库中。这里就不介绍了，下面介绍这样通过 WEB 方式将 Access 数据备份到 XML 文件中，本文使用的数据库是 E-home 中厨房系统中的菜谱数据库，数据库主要有一个表 FOOD，包含 id,name,info,type,number,time 字段，以下是在 Win2000 环境下备份 ACCESS 数据库的代码：（环境 Win2000+IIS）
文件名：FoodBackup.asp
<html>
<head>
<title>使用 XML 备份 Access 数据库</title>
</head>
<body>
<%
dim objconn
dim objrs
dim objfs
dim xmlfile
set objconn=server.createobject("adodb.connection")
//objconn.open "dsn=food;database=home;uid=;pwd=;"
objconn.open "driver={Microsoft Access Driver (*.mdb)};dbq="+SERVER.MapPath("home.mdb") //连接数据库，指定数据库文件的路径
//如果是 MS Sql Server 则为：
//objconn.open "driver={SQL Server};Database=Dbname;Server=ServerName;UID=Username;PWD=Password"
set objrs=server.CreateObject("Adodb.RecordSet")
objrs.Open "food",objconn
set objfs=server.CreateObject("Scripting.FileSystemObject")
set xmlfile=objfs.CreateTextFile("d:\food.xml")
xmlfile.writeline "<foodlist>"
while not objrs.EOF
xmlfile.writeline "<food><id>"&objrs("ID")&"</id><name>"
xmlfile.writeline objrs("name")&"</name><info>"&objrs("info")&"</info><type>"&objrs("type")
xmlfile.writeline "</type><number>"&objrs("number")&"</number><time>"&objrs("time")&"</time></food>"
objrs.MoveNext
wend
xmlfile.writeline "</foodlist>"
objrs.Close
set objrs=nothing
xmlfile.close
set xmlfile=nothing
%>
</body>
</html>
通过以上代码就可以实现对 ACCESS 数据库 FOOD 中表 food 的备份,只需要在本文件的基础上进行改动，就可以实现自由选择数据库中的表进行备份了。备份前文件的大小是 3.65M，备份后经过 Winzip 压缩后的大小只有 225KB，只需要通过对以上文件进行改动，也可以实现对 Oracle,Excell.Access,Visual Foxpro 等数据库信息的备份。
我们还可以通过 PHP 操作来对其他数据库进行备份，以下是在 Linux 下通过 Apache+PHP 对 Mysql 数据库的备份的文件代码：
文件一、Listtable.php （文件列出数据库中的所有表格，供选择备份）
<html>
<head>
<title>使用 XML 备份 Mysql 数据库</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
请选择要备份的表格:
<?
$con=mysql_connect('localhost','root','xswlily');
$lists=mysql_list_tables("embed",$con);
//数据库连接代码
$i=0;
while($i<mysql_num_rows($lists)){
$tb_name=mysql_tablename($lists,$i);
echo "<a href=backup.php?table=".$tb_name.">".$tb_name."</a><br>";
//列出所有的表格
$i++;}
?>
</body>
</html>
文件二、Backup.php
<?if ($table=="") header("Location:listtable.php");?><html>
<head>
<title>使用 XML 备份 Mysql 数据库</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<?
$con=mysql_connect('localhost','root','xswlily');
$query="select * from $table ";
//数据库查询
$result=mysql_db_query("embed",$query,$con);
$filestr="<"."?xml version=\"1.0\" encoding=\"GB2312\"?".">";
$filestr.="<".$table."s>";
while ($row=mysql_fetch_array($result))
//列出所有的记录
{$filestr.="<".$table.">";