Chuyển đổi dữ liệu quan hệ sang dữ liệu XML

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

doc6 trang | Chia sẻ: lylyngoc | Lượt xem: 1734 | Lượt tải: 1download
Bạn đang xem nội dung tài liệu Chuyển đổi dữ liệu quan hệ sang dữ liệu XML, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Chuyể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="" Do Until Rs.EOF     str=str & "" & Rs("HoTen") & ""     str=str & "" & Rs("DiaChi") & ""     ' Có thể bổ sung các thẻ khác để lưu địa chỉ, lớp...     Rs.MoveNext Loop str=str & "" xmlDoc.LoadXML(str) xmlDoc.Save(path) Ghi 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 = "\n"; $xml_output .= "\n"; while($row = mysql_fetch_array($rs)){ $xml_output .= "\t\n"; $xml_output .= "\t\t".$row['Hoten']."\n"; $xml_output .= "\t\t".$row['Diachi']."\n"; $xml_output .= "\t\n"; } $xml_output .= ""; $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: ( 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. + Đố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ả: Select * from SV for XML auto, elements cho kết quả: 01Võ Văn Quân08SPT 02Nguyễn Tiệp08CNTT1 Select * from SV for XML raw cho kết quả: Select * from SV for XML raw, elements cho kết quả: 01Võ Văn Quân08SPT 02Nguyễn Tiệp08CNTT1 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 Module 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=""   strXML &= "" & strXML & "" 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 connection.Open() adapter = New SqlDataAdapter(sql, SqlCon1) adapter.Fill(ds) connection.Close() strXML = "" strXML &= "" & ds.Tables(0).Rows(0).Item(0) & "" 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): 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 myCommand.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ỉ :
Tài liệu liên quan