Sử dụng các hàm DOM trong PHP5 để tạo tài liệu XML từ CSDL MySQL
1/Yêu cầu:
Bạn phải có phần má» rá»ng DOM trong PHP. Và cÅ©ng phải biết vá» cÆ¡ bản tà i liá»u XML .
Tà i liá»u nà y chá» sá» dụng ÄÆ°á»£c cho PHP 5 trá» lên. Chi tiết vá» há» trợ DOM xin tham khảo thêm á» php.net
2/ Xá» lý trên má»t bảng dữ liá»u:
Äoạn mã dưá»i Äây sẽ lấy ná»i dung từ $dbresult (không giá»i hạn sá» lượng hà ng) và viết và o má»t biến String có dạng tà i liá»u XML. Tà i liá»u nà y sau Äó có thá» ÄÆ°á»£c ghi ra ÄÄ©a hoặc biến Äá»i trong tà i liá»u HTML sá» dụng các hà m XSL ÄÆ°á»£c há» trợ trong PHP.
Äoạn code ban Äầu nà y thá»±c hiá»n kết ná»i database và truy vấn:
<?phpif(!$dbconnect = mysql_connect('localhost', 'user', 'pass')) {
echo "Lá»i kết ná»i tá»i host 'localhost'.";exit;} // ifif (!mysql_select_db('test')) {
echo "Không thá» kết ná»i database 'test'";exit;} // if$table_id = 'table_name'; // tên bảng dữ liá»u
$query = "SELECT * FROM $table_id";
$dbresult = mysql_query($query, $dbconnect);
Bây giá» chúng ta Äã có dữ liá»u Äá» chuyá»n và o tà i liá»u XML. Chúng ta khá»i tạo má»t liá»u DOM. Câu lá»nh sau thiết láºp phiên bản XML là '1.0', 'UTF-8' : Äá» hiá»n thá» Font Unicode há» trợ tiếng Viá»t
//khá»i tạo má»t tà i liá»u XML má»i
$doc = new DomDocument('1.0',`UTF-8`);
Tiếp theo sau khá»i tạo tà i liá»u DOM là tạo nút gá»c . Má»i tà i liá»u XML chá» có duy nhất má»tnút gá»c. Trong và dụ nà y, tôi Äặt nó là 'root', bạn có thá» Äặt tên gì tuỳ ý (ká» cả tên các liênquan tá»i mã PHP). Chú ý rằng bạn tạo nút và thêm nó và o tà i liá»u XML vá»i 2 hà m//tạo nút gá»c$root = $doc->createElement(ârootâ);
$root = $doc->appendChild($root);
Bưá»c tiếp theo , chúng ta phân tÃch dữ liá»u nháºn ÄÆ°á»£c từ database. Chú ý rằng trong bà i nà y, má»i giá trá» nháºn ÄÆ°á»£c từ hà ng ÄÆ°á»£c gán và o mảng vá»i cấu trúc
cặp : name => value (name : tên cá»t, value: giá trá» cá»§a cá»t tại hà ng Äó). //Äá»c từng hà ngwhile ($row = mysql_fetch_asscoc($dbresult)) {
Tác vụ Äầu tiên thá»±c hiá»n trên má»i hà ng dữ liá»u và o là thêm má»t nút má»i và o tà i liá»u XML. Trong bà i nà y tôi tạo nút sá» dụng tên cá»§a bảng dữ liá»u - bạn có thá» thay Äá»i tuỳ ý, sau Äó thêm và o tà i liá»u XML như là con cá»§a nút gá»c, trong trưá»ng hợp nà y là nút ârootâ. //thêm nút cho má»i hà ng dữ liá»u â trong trưá»ng hợp nà y là tên bảng$occ = $doc->createElement($table_id);
$occ = $root->appendChild($occ);
Bây giá» tôi sẽ là m vòng lặp Äá» Äá»c các cá»t trên hà ng hiá»n tại. BanSẽ không phải báºn tâm Äến có bao nhiêu cá»t á» trong h
à ng hiá»n tại, má»i cá»t trong hà ng tương ứng vá»i má»t
cặp ten_cot => gia_tri. //thêm má»i nút con cho má»i cá»t trên hà ng dữ liá»uforeach ($row as $fieldname => $fieldvalue) {
Chú ý rằng, tạo má»t nút má»i cho má»i cá»t và thêm nó và o tà i liá»u XML vá»i tư cách là con cá»§a hà ng hiá»n tại, trong trưá»ng hợp nà y là $occ
$child = $doc->createElement($fieldname);
$child = $occ->appendChild($fieldvalue);
Tiếp theo, Äá» thêm trưá»ng giá trá» và o, thì chúng ta dùng hà m createTextNode(). Trưá»ng giá trá» là con cá»§a tên cá»t hiá»n tại $value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
Vòng lặp sẽ Äá»c hết tất cả các cá»t trong má»i hà ng dữ liá»u trả vá» từ database. } //for each
} // for while
Hà m tiếp theo sẽ trả vá» má»t tà i liá»u XML hoà n chá»nh như là má»t string. //nháºn tà i liá»u XML hoà n chá»nh$xml_string = $doc->saveXML();
và cuá»i cùng bạn in tà i liá»u XML ra mà n hình;echo $xml_string;
?> Bạn sẽ ÄỠý thấy rằng: Khi gá»i hà m createElement, thì thêm cặp tag sau : ⦠. Khi gá»i hà m createTextNode, thì thêm giá trá» và o giữa cặp tag trên. Các bạn có thá» test chương trình bằng và dụ sau:- Tạo table trong vá»i câu lênh sau:
CREATE TABLE `cds` (`id` int(2) NOT NULL auto_increment,`title` varchar(90) character set armscii8 NOT NULL,`artist` varchar(90) character set armscii8 NOT NULL,PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci AUTO_INCREMENT=6 ; INSERT INTO `cds` VALUES (1, 'Get A Grip', 'Aerosmith');INSERT INTO `cds` VALUES (2, 'All That You Can''t Leave Behind', 'U2');INSERT INTO `cds` VALUES (4, 'Androgyny', 'Garbage');INSERT INTO `cds` VALUES (5, 'Classical', 'France');
- Mã nguá»n chương trình
<?phpif (!$dbconnect = mysql_connect('localhost','root','')){echo "Failed to open connection";exit;} if (!mysql_select_db('test')){echo "Could not open database";exit;}$table_id ='cds';$query="SELECT * FROM $table_id";$dbresult=mysql_query($query,$dbconnect); //create a new XML Document$doc=new DomDocument('1.0');//create node root$root = $doc->createElement('root');$root = $doc->appendChild($root); while ($row = mysql_fetch_assoc($dbresult)){$occ = $doc->createElement($table_id);$occ = $root->appendChild($occ);//read the column of row in databaseforeach ($row as $fieldname=>$fieldvalue){$child = $doc->createElement($fieldname);$child = $occ->appendChild($child);$value = $doc->createTextNode($fieldvalue);$value = $child->appendChild($value);}} $xml_string = $doc->saveXML();echo $xml_string;?>3/Quan há» trên nhiá»u bảng
Trong và dụ sau Äây, chuá»i XML sẽ chứa dữ liá»u cá»§a 2 bảng trong má»i quan há» Má»t-Nhiá»u.
Äoạn mã sau Äây sẽ có 2 truy vấn: $resouter truy vấn trên bảng Cha và $resinner truy vấn trên bảng Con.
//Kết ná»i:
<?php
if(!$dbconnect = mysql_connect('localhost', 'use', 'pass')) {
echo "Không kết ná»i ÄÆ°á»£c 'localhost'.";
exit;
} // if
if (!mysql_select_db('test')) {
echo "Không kết ná»i ÄÆ°á»£c CSDL 'test'";
exit;
} // if
Tiếp theo, truy vấn trên 2 bảng dữ liá»u:
//Bảng cha
$outer_table = 'parent_table';
$query = "SELECT * FROM $outer_table WHERE column='value'";
$resouter = mysql_query($query, $dbconnect);
//Bảng con
$inner_table = 'child_table';
$query = "SELECT * FROM $inner_table WHERE column='value'";
$resinner = mysql_query($query, $dbconnect);
Khá»i tạo tà i liá»u DOM và tạo nút gá»c:
// Tạo tà i liá»u XML $doc = new DomDocument('1.0','UTF-8');
// Thêm nút gá»c$root = $doc->createElement('root');
$root = $doc->appendChild($root);
Thêm má»t nút má»i cho dữ liá»u (hà ng dữ liá»u) trả vá» từ bảng cha
// Thêm nút má»i cho cho bảng cha $outer = $doc->createElement($outer_table);
$outer = $root->appendChild($outer);
Chúng ta nên nhá» rằng: thêm má»i cá»t giá trá» (má»i
hà ng dữ liá»u có nhiá»u cá»t) như là nút con cá»§a nút
$outer// Nháºn từng hà ng dữ liá»u từ bảng cha$row = mysql_fetch_assoc($resouter);
// Thêm má»i nút con cho má»i cá»t giá trá» nháºn ÄÆ°á»£c foreach ($row as $fieldname => $fieldvalue) {
$child = $doc->createElement($fieldname);
$child = $outer->appendChild($child);
$value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
} // foreachTiếp theo, chúng ta thêm các nút má»i cho má»i hà ng dữ liá»u nháºn
ÄÆ°á»£c từ bảng con. Chú ý rằng: các hà ng nà y ÄÆ°á»£c thêm và o như
vá»i tư cách là nút con cá»§a nút $outer, chứ không phải là nút $root.
Má»i nút $inner sẽ có các nút con là các cá»t dữ liá»u trả từ truy vấn
trên bảng con.
// XỠlý các hà ng trả vỠtừ truy vấn trên bảng conwhile ($row = mysql_fetch_assoc($resinner)) {
// Thêm nút má»i cho má»i hà ng $inner = $doc->createElement($inner_table);
$inner = $outer->appendChild($inner);
// Thêm nút con má»i cho má»i cá»t thuá»c hà ng foreach ($row as $fieldname => $fieldvalue) {
$child = $doc->createElement($fieldname);
$child = $inner->appendChild($child);
$value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
} // foreach } // while Cuá»i cùng, ta thu ÄÆ°á»£c tà i liá»u XML Äầy Äá»§ và gá»i nó lên trình duyá»t
// Trả vá» tà i liá»u XML $xml_string = $doc->saveXML();
echo $xml_string;?>
Äoạn mã trên sẽ trả vá» trình duyá»t má»t file XML có cấu trúc sau:
<?xml version="1.0"?>
value1
value2
............
valueX
value1
value2
............
valueX
............
Nó có cấu trúc: nút gá»c () -> nút bảng cha ()
->nút bảng con (). Nút bảng cha ()
có các nút con là các cá»t dữ liá»u trên chÃnh nó và dữ liá»u trả vá» từ bảng con
4/ Thêm các THUá»C TÃNH và o tà i liá»u XML (attributes)
Có Äôi lúc chúng ta cần thiết phải thêm và o các thông tin Äi kèm vá»i má»i nút
trong tà i liá»u XML, và nó ÄÆ°á»£c thá»±c thiá»n thông qua thuá»c tÃnh nút. Má»t thuá»c
tÃnh bao gá»m Tên và Giá Trá» cá»§a nó, bạn có thá» thêm và o các nút bao nhiêu
thuá»c tÃnh tuỳ ý. Nó ÄÆ°á»£c thá»±c hiá»n như sau:
$child = $doc->createElement($fieldname);
$child = $outer->appendChild($child);
$child->setAttribute('attr1', 'attrval1');
$child->setAttribute('attr2', 'attrval2');
$value = $doc->createTextNode($fieldvalue);
$value = $child->appendChild($value);
Và tà i liá»u XML chúng ta nháºn ÄÆ°á»£c có dạng như sau:
<?xml version="1.0"?>
<column1 attr1="attrval1" attr2="attrval2">value1
<column2 attr1="attrval1" attr2="attrval2">value2
<column3 attr1="attrval1" attr2="attrval2">value3
Sao anh toan dua cac phuong phap va cach hoc tap,lam viec ko a.Viet ve ban than anh hoac cai j hay hay 1 chut.
ReplyDelete