XML được sử dụng để lưu trữ dữ liệu và nhất là vận chuyển dữ liệu giữa các ứng dụng trong môi trường desktop hay internet.. - XML được sử dụng để lưu trữ dữ liệu, nhưng không thay thế CS
Trang 1Chuyển đổi dữ liệu quan hệ sang dữ liệu XML
Tác giả: Ngô Đình Thưởng, Khoa Tin học, Trường ĐHSP Đà Nẵng
I Giới thiệu
XML là từ viết tắt của eXtensible Markup Language, XML được Jon Bosakv (Sun MicroSystems)
xây dựng từ năm 1998 XML được sử dụng để lưu trữ dữ liệu và nhất là vận chuyển dữ liệu giữa
các ứng dụng trong môi trường desktop hay internet
- XML được sử dụng để lưu trữ dữ liệu, nhưng không thay thế CSDL quan hệ mà được sử dụng cho nhu cầu nhất định bởi đặc tính của nó là một file văn bản, không phụ thuộc vào platform
Trong sơ đồ tiến hóa của các hệ cơ sở dữ liệu (hình 1), XML là nền tảng cho các hệ cơ sở dữ liệu noSQL, hệ cơ sở dữ liệu web Hiện nay, bộ môn Khai phá dữ liệu web đang được nghiên cứu và
giảng dạy trong chương trình đào tạo CNTT
Hình 1: Sơ đồ tiến hóa của các hệ cơ sở dữ liệu [1]
- XML được sử dụng để trao đổi thông tin giữa các module trong một ứng dụng như Windows, SQL Server, Apache… và còn được sử dụng để vận chuyển dữ liệu như ứng dụng SOAP, Webservice…
- Hiện nay, một khối lượng lớn dữ liệu được lưu trữ trong các hệ CSDL quan hệ, vấn đề là làm sao chuyển đổi kho dữ liệu này thành dạng dữ liệu XML
Trong bài viết này, chúng tôi mô tả các kỹ thuật để chuyển đổi dữ liệu trong các hệ cơ sở dữ liệu
thông dụng như SQL Server, Access 2003 và MySQL sang tệp dữ liệu XML với ADO.NET.
II Tổng quan về ADO.NET
II.1- Phương pháp cổ điển
Phương pháp cổ điển được sử dụng cho ngôn ngữ VB, VBScript dựa vào giao diện ADO, hay PHP dựa vào đối tượng recordset để trích xuất dữ liệu ra thành một stream XML, sau đó lưu vào tệp XML Sau đây các tóm tắt ví dụ cho bảng SV(Masv,Hoten, DiaChi,Lop):
• Với VBScript & ADO 3.0
path = "C:\sv.xml"
Dim xmlDoc
Set xmlDoc=Server.CreateObject("Microsoft.XMLDOM")
‘ trích xuất dữ liệu vào đối tượng recordset rs
str="<?xml version=’1.0’?><UED>"
Do Until Rs.EOF
str=str & "<SinhVien><HoTen>" & Rs("HoTen") & "</HoTen>"
str=str & "<DiaChi>" & Rs("DiaChi") & "</DiaChi></SinhVien>"
' Có thể bổ sung các thẻ khác để lưu địa chỉ, lớp
Rs.MoveNext
Loop
str=str & "</UED>"
xmlDoc.LoadXML(str)
xmlDoc.Save(path)
Trang 2Ghi chú: trong môi trường Net Framework, ta có hàng loạt các lớp xử lý XML, nhưng quan trọng nhất là lớp XmlDocument nằm trong name space System.Xml
• Với PHP và MySQL
// giả sử dữ liệu được truy vấn và lưu trong đối tượng recordset $rs
$xml_output = "<?xml version=\"1.0\"?>\n";
$xml_output = "<UED>\n";
while($row = mysql_fetch_array($rs)){
$xml_output = "\t<SV>\n";
$xml_output = "\t\t<HoTen>".$row['Hoten']."</Hoten>\n";
$xml_output = "\t\t<Diachi>".$row['Diachi']."</Diachi>\n";
$xml_output = "\t</SV>\n";
}
$xml_output = "</UED>";
$fp=fopen("C:\sv.xml","w");
fwrite($fp,$xml_output);
fclose($fp);
II.2- Tổng quan về ADO.NET
Nhằm khắc phục những hạn chế của mô hình ADO, Microsoft xây dựng ADO.NET chạy trên nền Net Framework, nó được xem như là một giao diện lập trình cơ sở dữ liệu cho các ứng dụng dựa trên Net Framework, đặc biệt đưa ra các kỹ thuật kết xuất dữ liệu quan hệ thành dữ liệu XML với các phương pháp phong phú Mô hình kiến trúc ADO.NET được minh họa như sau:
Nguồn: http://www.codeproject.com ( có hiệu chỉnh)
+ Data Provider bao gồm các lớp: Connection, Command, DataAdapter và DataReader
Lớp Connection thiết lập kết nối với dữ liệu nguồn và là một tham chiếu kết nối trong các lớp
Command và DataAdapter Có 3 phiên bản của lớp Connection:
- SqlConnection dành cho hệ cơ sở dữ liệu SQL Server
- OleDbConnection dành cho các hệ cơ sở dữ liệu khác
- OdbcConnection để thực hiện kết nối thông qua ODBC (Open Database Connectivity), trong 3 phiên bản trên đáng chú ý nhất là SqlConnection và OledbConnection Tương ứng với phiên bản Connection ta có các lớp Command, DataAdapter và DataReader phù hợp Các lớp trên nằm trong
name sapce System.Data.SqlClient
Lớp Command có trách nhiệm thực thi các câu lệnh SQL hay các Stored Procedure
Đối tượng DataAdapter là cầu nối giữa đối tượng Connection và đối tượng DataSet ADO.NET
đưa ra 3 phiên bản khác nhau về đối tượng DataAdapter: dùng cho SQL Server, dùng cho OLEDB với các cơ sở dữ liệu quan hệ khác nhau và ODBC Data Provider Điều quan trọng nhất khi sử
dụng OLEDB là phải xác định connection string đến từng loại cơ sở dữ liệu Thông tin cụ thể được trình bày tại website www.connectionstrings.com
Đối tượng DataReader và một thay thế cho đối tượng DataSet, nhưng chỉ cho phép đọc dữ liệu
theo chiều tiến về phía trước mà thôi
Trang 3+ Đối tượng DataSet sử dụng XML để lưu trữ dữ liệu trong cache và vận chuyển dữ liệu giữa các
ứng dụng và Data Provider, điều khác biệt với ADO 3.0, đối tượng DataSet chứa nhiều đối tượng DataTable Đối tượng DataSet là thành phần chính của ADO.NET
III Các phương pháp chuyển đổi dữ liệu quan hệ sang dữ liệu XML
III.1 Tổng quan về các phương pháp
Cốt lõi của phương pháp là chuyển đổi dữ liệu lưu trong DataSet hay dữ liệu trả về của phương thức ExecuteScalar thành một Stream XML.
- Với đối tượng StreamWriter lấy dữ liệu trong DataSet Tables(0).Rows(0).Item(0) và lưu thành
tệp XML Sở dĩ chọn chỉ số 0 của các đối tượng vì câu lệnh Select … for XML trả về một bảng chỉ
có một dòng, một cột
- Với đối tượng DataSet thì bản thân nó chứa dữ liệu dưới dạng XML, phương thức getXML() lấy
thông tin trong DataSet và cho lại một Stream XML Lúc này xử dụng các phương thức của lớp
XmlDocument để nạp vào cây XML và lưu thành tệp XML.
Sau đây là các ví dụ:
III.2 Sử dụng đối tượng Command
Thế mạnh của đối tượng Command là nó cho phép thực thi câu lệnh SQL, trong đó câu lệnh
Select for XML cho phép kết xuất kết quả ra một XML Stream Tùy theo nhu cầu cụ thể, ta sử
dụng câu lệnh này với các nhiệm ý phù hợp
Cú pháp : Select from for XML auto | raw | explicit [,xmldata | , elements]
Giả sử ta có cơ sở dữ liệu SQL Server QLSV trong đó có bảng SV(Maso, Hoten, Lop)
Select * from SV for XML auto cho kết quả:
<SV Maso=”01” Hoten=”Võ Văn Quân” Lop=”08SPT”/>
<SV Maso=”02” Hoten=”Nguyễn Tiệp” Lop=”08CNTT1”/>
Select * from SV for XML auto, elements cho kết quả:
<SV><Maso>01</Maso><Hoten>Võ Văn Quân</Hoten><Lop>08SPT</Lop></SV>
<SV><Maso>02</Maso><Hoten>Nguyễn Tiệp</Hoten><Lop>08CNTT1</Lop></SV>
Select * from SV for XML raw cho kết quả:
<row Maso=”01” Hoten=”Võ Văn Quân” Lop=”08SPT”/>
<row Maso=”02” Hoten=”Nguyễn Tiệp” Lop=”08CNTT01”/>
Select * from SV for XML raw, elements cho kết quả:
<row><Maso>01</Maso><Hoten>Võ Văn Quân</Hoten><Lop>08SPT</Lop></raw>
<row><Maso>02</Maso><Hoten>Nguyễn Tiệp</Hoten><Lop>08CNTT1</Lop></raw>
Các phương pháp trên cho lại một XML Stream nhưng thiếu chỉ thị xử lý và nút gốc của cây XML
và ta phải bổ sụng trước khi lưu tệp XML Ví dụ:
Imports System.Xml
Imports System.Data.SqlClient
Trang 4Module Module1
Dim xmlDoc As New XmlDocument
Sub Main()
Dim objConn As New SqlConnection("Data _
Source=NDT\SqlExpress;Database=QLSV;Integrated Security=SSPI;")
objConn.Open()
Dim objCmd As New SqlCommand("select * from SV for xml auto,_ elements",_ objConn)
Dim strXML As String = objCmd.ExecuteScalar.ToString
strXML="<?xml version=’1.0’?>"
strXML &= "<UED>" & strXML & "</UED>"
xmlDoc.LoadXml(strXML)
xmlDoc.Save("D:\UED.XML")
End Sub
End Module
Trong môi trường VB 6.0 hay VbScript ta cũng có thể thực hiện việc chuyển đổi như trên, nhưng
mã nguồn dài hơn khá nhiều
III.3 Sử dụng đối tượng DataSet
Giả sử rằng cơ sở dữ liệu QLSV được đặt trên máy NDT\SQLExpress và được phân quyền Select cho user có tên “TH” và mật khẩu ”1234”,
a- Dùng phương thức WriteXML của đối tượng DataSet
Imports System.Xml
Imports System.Data.SqlClient
….
Dim strCon As String = "Data Source=NDT\SQLExpress;Initial Catalog=SV;_
User ID=TH;Password=1234; Trusted_Connection=Yes"
Dim connection As New SqlConnection(strCon)
Dim adapter As New SqlDataAdapter
Dim ds As New DataSet
Dim strSql As String
strSql = "Select * from SV"
Try
connection.Open()
adapter = New SqlDataAdapter(strSql, strCon)
adapter.Fill(ds)
connection.Close()
ds.WriteXml("D:\UED.XML")
MsgBox("Done!")
Catch ex As Exception
MsgBox(ex.ToString)
End Try
b- Dùng đối tượng StreamWriter
Imports System.Xml
Imports System.Data.SqlClient
Imports System.IO
…
Dim connection As SqlConnection
Dim adapter As SqlDataAdapter
Dim ds As New DataSet
Dim sql As String
Dim strXML As String
Dim SqlCon As String = "Data Source=NDT\SQLExpress;Initial Catalog=SV;_
User ID=TH;Password=1234; Trusted_Connection=Yes"
connection = New SqlConnection(SqlCon)
sql = "select * from SV for xml auto"
Try
Trang 5adapter = New SqlDataAdapter(sql, SqlCon1)
adapter.Fill(ds)
connection.Close()
strXML = "<?xml version=’1.0’?>"
strXML &= "<UED>" & ds.Tables(0).Rows(0).Item(0) & "</UED>"
Using writer As StreamWriter = New StreamWriter("D:\UED.xml")
writer.Write(strXML) End Using
MsgBox("Done")
Catch ex As Exception
MsgBox(ex.ToString)
End Try
c- Dùng phương thức getXML của đối tượng DataSet
Ví dụ sau đây dùng cơ sở dữ liệu MS Access 2003 để minh họa cho cách sử dụng OLEDB
Imports System.Xml
Imports System.Data.SqlClient
…
Dim strSQL As String = "Select * from SV"
Dim path As String = "D\QLSV.MDB"
Dim objDataSet As New DataSet
Dim objCon As OleDbConnection
Dim strCon As String
Dim xmlDoc As New XmlDocument
strCon = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=" & path
objCon = New OleDbConnection(strCon)
Dim objAdapter As New OleDbDataAdapter(strSQL, objCon)
objAdapter.Fill(objDataSet)
objCon.Close()
xmlDoc.LoadXml(objDataSet.GetXml())
xmlDoc.Save("D:\UED.XML")
MsgBox("Export completed!")
III.4 Sử dụng CSDL MySQL
Việc chuyển đổi dữ liệu MySQL thành dữ liệu XML với PHP đã nêu trên, tuy nhiên trong môi trường Net Framework cần tiến hành một số cài đặt bổ sung:
Tải phần mềm mysql-connector-net.exe tại địa chỉ: (chọn phiên bản phù hợp):
http://dev.mysql.com/downloads/connector/net/1.0.html
Khi tham chiếu name space, thực thi các phương thức, sử dụng các thuộc tính chú ý đến tiền tố MySQL thay vì SQL Sau đây là một ví dụ:
Imports MySql.Data.MySqlClient
Imports System.IO
Dim myCommand As New MySqlCommand
Dim myAdapter As New MySqlDataAdapter
Dim myData As New DataSet
Dim table As String = "SV"
Dim strSQL As String = "Select * from SV"
Dim conn = New MySqlConnection()
conn.ConnectionString = "server=localhost; user id=root; password='';_
database=qlsv"
Try
conn.Open()
Try
Trang 6myCommand.Connection = conn myCommand.CommandText = strSQL myAdapter.SelectCommand = myCommand myAdapter.Fill(myData, table)
myData.WriteXml("C:\ued.xml") MsgBox("Done!") Catch myerror As MySqlException
MsgBox("There was an error reading from the database" _
& myerror.message ) End Try
Catch myerror As MySqlException
MessageBox.Show("Error connecting to the database")
Finally
If conn.State <> ConnectionState.Closed Then conn.Close()
End Try
IV Tài liệu tham khảo
[1] Hà Quang Thụy (chủ biên), Giáo trình Khai phá dữ liệu Web, nxb Giáo dục, Hà Nội, 2009 [2] Hiroshi Maruyama và cộng sự, XML and Java, Developing Web Application, nxb Addison
Wesley, 2002
[3] Dương Quang Thiện, Lập trình web, tập 5, nxb Tổng hợp TP HCM, 2005
[4] Phạm Hữu Khang, Lập trình ASP.NET 2.0, quyển 4, nxb Lao động-Xã hội, Hà Nội, 2007
[5] Nguyễn Tiến Huy, Giáo trình Công nghệ XML và Ứng dụng, download từ địa chỉ :
http://www.ebook.edu.vn/?page=1.39&view=11061