为了能够让不同平台的异构数据库之间能够互相交换数据,完成一个数据库的数据迁移到另一个数据库中,可以采用XML文档作为数据交换的信息载体,把一个数据库的数据转换为XML文档,将XML文档通过网络传输到另一个系统,再由另一个系统平台程序将XML文档导入数据库。
用DOM和SAX解析器将数据库中的数据导出来生成XML,步骤基本为下:
1. 建立与数据库的连接。
2. 执行SQL语句从数据库中检索到数据。
3. 将检索到的数据转换为XML文档。
4. 若有必要还可将XML文档转化为HTML文档。
例如:
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<title>Select user info from DB</title>
</head>
<body>
<?php
include "DBconnection.php";//负责连接数据库的文件
$sql="select * from user_info";
$result=mysqli_query($conn,$sql);
if(mysqli_num_rows($result)){
$dom=new DOMDocument('1.0',"utf-8");
$dom->formatOutput=true;
$root=$dom->createElement("userinfo");
$dom->appendChild($root);
while(list($uname,$upassword,$idnumber,$phonenumber)=mysqli_fetch_array($result)){
$user=$dom->createElement("user");
$user->setAttribute('IDnumber',$idnumber);
$user->appendChild($dom->createElement("uname",$uname));
$user->appendChild($dom->createElement("upassword",$upassword));
$user->appendChild($dom->createElement("phonenumber",$phonenumber));
$root->appendChild($user);
}
$xml=$dom->saveXML();
$dom->save("userinfo.xml");
//echo $xml;
}
mysqli_close($conn);
//以下数据保存开始标签的HTML标记
$startTags=array(
//标签名需要大写!
'USERINFO'=>'<table border="1" cellspacing="0" cellpadding="5">',
'USER'=>'<tr>',
'IDNUMBER'=>'<td bgcolor="silver">',
'UNAME'=>'<td bgcolor="silver">',
'UPASSWORD'=>'<td bgcolor="silver">',
'PHONENUMBER'=>'<td bgcolor="silver">',
);
$endTags=array(
'USERINFO'=>'</table>',
'USER'=>'</tr>',
'IDNUMBER'=>'</td>',
'UNAME'=>'</td>',
'UPASSWORD'=>'</td>',
'PHONENUMBER'=>'</td>',
);
//以下函数为各个标签的回调函数
function startElementHandler($parser,$root,$attribute){
global $startTags;
if($startTags [$root]){
//查找本开始元素对应的数组元素
echo $startTags [$root];
}
}
function endElementHandler($parser,$root){
global $endTags;
if($endTags [$root]){
echo $endTags [$root];
}
}
function characterDataHandler($parser,$data){
echo utf8_decode($data);
}
$xml=utf8_encode($xml);
$xml_parser=xml_parser_create("utf-8");
xml_set_element_handler($xml_parser,"startElementHandler","endElementHandler");
xml_set_character_data_handler($xml_parser,"characterDataHandler");
if(!xml_parse($xml_parser,$xml)){
$error_code=xml_get_error_code($xml_parser);
die("XML解析错误(错误代码".$error_code."):".xml_error_string($error_code)."<br>错误发生的行"
.xml_get_current_line_number($xml_parser) ."错误发生的列".xml_get_current_column_number($xml_parser)
."错误发生的字节".xml_get_current_byte_index($xml_parser));
}
xml_parser_free($xml_parser);
?>
</body>
</html>
运行后的效果大致如下:(即以表格的形式从数据库中读出数据并将相应的标记转化为HTML标记)
在上述程序中,我查询的user_info表的具体创建如下,可以蛮参考一下:
CREATE TABLE user_info (
uname VARCHAR(20) NOT NULL KEY,
upassword VARCHAR(20) NOT NULL,
idnumber VARCHAR(20) NOT NULL,
phonenumber VARCHAR(20) NOT NULL
)