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:


<?php
if(!$dbconnect = mysql_connect('localhost', 'user', 'pass')) {
echo "Lỗi kết nối tới host 'localhost'.";
exit;
} // if
if (!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ột
nú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ên
quan 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àng
while ($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ệu
foreach ($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
 
<?php
if (!$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 database
foreach ($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);
 } // foreach
Tiế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 con
 while ($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

  

 


Comments

  1. now_and_forever5/19/06, 1:13 AM

    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

Post a Comment

Popular posts from this blog

Setup SharePoint 2010

Register CSS to SP Master Page