Tạo một tài liệu XML đúng cấu trúc Một tài liệu XML được gọi là có cấu trúc đúng khi nó tuân thủ đầy đủ các luật lệ về thẻ Tag, phần tử Element, thuộc tính Attribute, giá trị Value… chứ
Trang 1-
Bùi Ngọc Dũng NGHIÊN CỨU MỘT SỐ KỸ THUẬT KHAI PHÁ DỮ LIỆU XML ỨNG DỤNG TRONG THỰC HIỆN XỬ LÝ DỮ LIỆU QUAN HỆ
Chuyên nghành: Đảm bảo toán học cho máy tính và hệ thống tính toán
LUẬN VĂN THẠC SỸ KHOA HỌC ĐẢM BẢO TOÁN HỌC CHO MÁY TÍNH
VÀ HỆ THỐNG TÍNH TOÁN
NGƯỜI HƯỚNG DẪN KHOA HỌC:
1 PGS TS HUỲNH QUYẾT THẮNG
Hà Nội - 2011
Trang 2- 1 -
LỜI CAM ĐOAN
Kính gửi:
- Trung tâm Đào tạo và Bồi dưỡng sau Đại học
- Trường Đại học Bách Khoa Hà Nội
Tên tôi là: Bùi Ngọc Dũng
Sinh ngày: 19-02-1984
Là học viên cao học khóa 2008-2010
Tôi xin cam đoan: Toàn bộ kiến thức và nội dung trong bài luận văn của tôi
là các kiến thức tự nghiên cứu từ các tài liệu tham khảo trong và ngoài nước, không
có sự sao chép hay vay mượn dưới bất kỳ hình thức nào để hoàn thành luận văn tốt nghiệp luận văn tốt nghiệp Cao học chuyên nghành Đảm bảo toán học cho máy tính
và hệ thống tính toán
Tôi xin chịu hoàn toàn trách nhiệm về nội dung của luận văn này trước Trung tâm đào tạo và Bồi dưỡng sau đại học, Trường đại học Bách khoa Hà Nội
Trang 3- 2 -
MỤC LỤC
LỜI CAM ĐOAN 1
MỞ ĐẦU 4
Chương 1 TÌM HIỂU CHUNG VỀ XML 5
1.1. XML là gì? 5
1.2. Lý do ra đời của XML 5
1.3. Ứng dụng của XML trong các hệ thống thông tin hiện đại 6
Chương 2 KHAI PHÁ DỮ LIỆU XML 8
2.1. Biểu diễn dữ liệu trong XML 8
2.1.1. Tạo một tài liệu XML đúng cấu trúc 8
2.1.2. Chỉ thị xử lý và ghi chú 11
2.1.3. Không gian tên 12
2.1.4. CDATA và thực thể tham chiếu 15
2.2. XPath và xử lý tài liệu XML 16
2.2.1. Biểu diễn XML trong XPath 17
2.2.2. Đường dẫn trong XML 18
2.2.2.1. Đường dẫn tuyệt đối 19
2.2.2.2. Đường dẫn tương đối 20
2.2.2.3. Đường dẫn và điều kiện 21
2.2.3. Tập hợp và chỉ mục 21
2.2.4. Từ khóa và các phép toán 22
2.2.4.1. Từ khóa 22
2.2.4.2. Phép toán sàng lọc (Filter) 23
2.2.4.3. Phép toán so sánh (Compare) 24
Trang 4- 3 -
2.2.4.4. Phép toán hội (Union) 25
2.2.4.5. Các phép toán khác 25
Chương 3 SQL SERVER VÀ DỮ LIỆU XML 29
3.1 SQL Server và kiểu dữ liệu XML 29
3.2 Khai phá dữ liệu XML trong SQL Server 29
3.2.1 Cách sinh ra một tài liệu XML trong SQL Server 29
3.2.2 Thao tác với dữ liệu XML trong SQL Server 42
Chương 4 ỨNG DỤNG KHAI PHÁ DỮ LIỆU XMLTRONG CƠ SỞ DỮ LIỆU QUAN HỆ 55
4.1. Phát biểu bài toán 55
4.2. Các giải pháp thực hiện 56
4.2.1. Replication 56
4.2.2. DataMirror 57
4.2.3. Giải pháp đề nghị 58
4.3. Thực hiện giải pháp 61
4.3.1. Thực hiện 61
4.3.2. Một số chú ý 63
KẾT LUẬN 66
TÀI LIỆU THAM KHẢO 68
Trang 5- 4 -
MỞ ĐẦU
Hiện nay, trong ngành Công nghệ thông tin, XML (eXtensible Markup
Language) chiếm một vai trò rất quan trọng Để thấy ảnh hưởng rộng lớn của XML
trong ngành Công Nghệ Thông Tin ta chỉ cần để ý rằng XML chính là lý do của sự xuất hiện Microsoft.Net Từ hệ điều hành WindowsXP trở đi, bên trong đầy dẫy XML Hãng phần mềm Microsoft đã đầu tư hơn 3 tỷ đô la Mỹ vào kỹ thuật này, và sau sự xuất hiện của XML trong WindowsXP thì các ứng dụng của Microsoft nếu không thể chuyển qua chạy trên nền NET thì ít nhất cũng sẽ được chuyển thành
dùng cho NET được thông qua XML Đi song song với NET là SQLServer một
cơ sở dữ liệu dần hổ trợ XML một cách hoàn toàn
Tại thời điểm hiện tại Web Services đã trở nên rất thông dụng, nó đã trở
thành một phần quan trọng trong việc xây dựng một hệ thống thông tin diện rộng Việc sử dụng Web Service cho phép ta có thể xây dựng các ứng dụng mà có thể kết nối trao đổi thông tin với nhau mà không cần phải đồng bộ hóa các ứng dụng này trên cùng một nền, trên cùng hệ điều hành Các ứng dụng có thể được xây dựng bới nhiều loại ngôn ngữ lập trình khác nhau: Net, Visual Basic, ASP, php, java và được build trên nhiều loại hệ điều hành khác nhau: Windows XP, Windows Server, Linux,… Nhưng vẫn có thể trao đổi thông tin được với nhau, đây chính là cách thức
để có thể dễ dàng nâng cấp cho hệ thống, kết nối các hệ thống có sẵn với nhau Web Services được triển khai dựa vào XML với các giao thức http, https, chuẩn
Trong khuân khổ của đồ án này, ngoài việc tập trung vào tìm hiểu về XML
em tập trung vào nghiên cứu về ứng dụng của XML vào trong cơ sở dữ liệu SQLServer, đề xuất bài toán ứng dụng thực tế để khai phá dữ liệu XML trong cơ sở
dữ liệu SQLServer trên mô hình WAN diện rộng mục tiêu đồng bộ dữ liệu từ các đơn vị cấp thấp lên các đơn vị cao hơn
Trang 6XML là ngôn ngữ xây dựng cấu trúc tài liệu văn bản, dựa theo chuẩn SGML (Standard Generalized Markup Language: siêu ngôn ngữ có khả năng sinh ngôn ngữ khác) SGML được phát triển cho việc định cấu trúc và nội dung tài liệu điện tử, do
tổ chức ISO (International Organization for Standards) chuẩn hoá năm 1986 SGML
là do IBM đưa ra, song không thể không kể đến những đóng góp của các công ty khác XML được W3C phát triển, nhưng đặc tả XML lại do Netscape, Microsoft và các thành viên của dự án Text Encoding Initiative (TEI) xây dựng Tổ chức W3C XML Special Interest Group có đại diện từ hơn 100 công ty cùng nhiều chuyên gia được mời khác
1.2 Lý do ra đời của XML
Lý do ra đời của XML vì SGML rất rắc rối, và HTML có nhiều giới hạn nên năm 1996 tổ chức W3C thiết kế XML XML version 1.0 được định nghĩa trong hồ
sơ “February 1998 W3C Recommendation”
Điểm quan trọng của XML là nó không thuộc riêng về một công ty nào mà là một sản phẩm mà trí tuệ của nó thuộc về cả thế giới, là một tiêu chuẩn được mọi người công nhận vì được soạn ra bởi World Wide Web Consortium - W3C (Một tổ chức độc gồm rất nhiều các chuyên gia soạn thảo ra các tiêu chuẩn cho trình duyệt Web, máy chủ và ngôn ngữ) và các cá nhân muốn đóng góp thông qua trao đổi bằng Email Bản thân của XML tuy không có gì khó hiểu, nhưng các công cụ chuẩn được
Trang 7- 6 -
định ra để làm việc với XML như Document Object Model - DOM, XPath, XSL,
v.v thì rất hữu hiệu, và chính các chuẩn này cũng được phát triển không ngừng
Microsoft đã tập trung vào XML ngay từ đầu, chẳng những có đại diện để làm việc thường trực trong W3C mà còn tích cực đóng góp bằng cách gởi những đề nghị Tại Microsoft, khi tiêu chuẩn về XML chưa được hoàn thành thì các sản phẩm của Microsoft tuân thủ những gì có vẻ được đa số công nhận và khi tiêu chuẩn hoàn thành thì tuân thủ hoàn toàn
Công cụ làm việc với XML sáng giá nhất do Microsoft phát triển là ActiveX
MSXML Nó được dùng trong Visual Basic 6, ASP (Active Server Pages) của IIS
và Internet Explorer từ version 5.5 Hiện nay MSXML đã có version 6.0 và gồm nhiều các modul trong đó nổi bật là: MSXML Parse (đọc và phân tích) và Validate (kiểm tra sự hợp lệ) của XML file MSXML cũng giúp ta dựa vào một XSL file để transform (Chuyển đổi) một XML file thành một trang Web (HTML) hay một XML
khác
1.3 Ứng dụng của XML trong các hệ thống thông tin hiện đại
Dưới sự tác động của Microsoft và các hãng lập trình hàng đầu, cũng như những người yêu thích công nghệ Ngày nay, XML xuất hiện hầu như ở tất cả các
hệ điều hành, ngôn ngữ lập trình, hệ quản trị cơ sở dữ liệu cũng như các ứng dụng phát triển
Từ sau hệ điều hành WindowsXP của Microsoft việc xuất hiện của XML càng phổ biến hơn, nó xuất hiện và được hỗ trợ tại hầu hết các ứng dụng nền của hệ điều hành, của các ứng dụng Plugin Windows xây dựng cả một FrameWork để hỗ trợ cho XML và FrameWork này ngày càng được bổ xung và hoàn thiện Cho tới thời điểm hiện tại, các phần mềm được sử dụng nhiều của Microsoft mà tại đó ta đều thấy sự xuất hiện không thể thiếu của XML như: Microsoft Word, Microsoft Excel, InfoPath hay trong công cụ lập trình Visual Studio
Trang 8- 7 -
Các hệ quản trị cơ sở dữ liệu quan hệ cũng nhận ra được vai trò to lớn của XML cụ thể như SQL Server đã bắt chấp nhận XML như một kiểu dữ liệu từ phiên bản SQL Server 2005 và cùng với kiểu dữ liệu là những cú pháp hỗ trợ cho việc khai phá dữ liệu XML ngay trên nền hệ quản trị cơ sở dữ liệu Đến phiên bản SQL Server 2008 thì sự hỗ trợ càng trở nên rõ nét với việc tối ưu hóa về tốc độ cho kiểu
dữ liệu cũng như các thao tác xử lý với kiểu dữ liệu XML
Ngoài ra còn rất nhiều các ứng dụng khác do các lập trình trên thế giới phát triển sử dụng cũng như hỗ trợ XML
Trang 9- 8 -
Chương 2 KHAI PHÁ DỮ LIỆU XML 2.1 Biểu diễn dữ liệu trong XML
2.1.1 Tạo một tài liệu XML đúng cấu trúc
Một tài liệu XML được gọi là có cấu trúc đúng khi nó tuân thủ đầy đủ các luật lệ về thẻ (Tag), phần tử (Element), thuộc tính (Attribute), giá trị (Value)… chứa bên trong để bộ phân tích có thể nhận diện Cụ thể như sau:
- Có một phần tử gốc duy nhất gọi là Root Element hay Document Element
nó chứa tất cả các phần tử khác trong tài liệu;
- Mỗi một thẻ mở, phải có một thẻ đóng giống như nó;
- Trong tên của thẻ có phân biệt chữ hoa, chữ thường;
- Mỗi một phần tử con phải nằm trọn trong phần tử cha của nó;
- Giá trị của thuộc tính phải được đặt trong một cặp ngoặc kép
Tại luật thứ nhất: tài liệu XML sau không đúng cấu trúc vì nó không có phần
tử gốc:
< Product ProductID = "1" >Chair</ Product >
< Product ProductID = "2" >Desk</ Product >
Tài liệu XML như trên được gọi là XML phân mảnh, muốn cho tài liệu này trở thành đúng cấu trúc ta phải đặt các phần tử vào trong một phần tử gốc, ví dụ:
< Catalog >
< Product ProductID = "1" >Chair</ Product >
< Product ProductID = "2" >Desk</ Product >
</ Catalog >
Tại luật thứ hai: Mỗi một thẻ mở phải có một thẻ đóng giống như nó, trường hợp một thẻ mà không có dữ liệu thì có thể viết ngắn gọn lại như sau <Tag /> như vậy tài liệu sau không đúng cấu trúc:
< Order >
< OrderDate >2002-6-14</ OrderDate >
< Customer >Helen Mooney</ Customer >
< Item >
Trang 11- 10 -
Tại luật thứ bốn: Mỗi một phần tử con phải nằm trọn trong phần tử cha của
nó, tức là không thể bắt đầu một phần tử mới khi chưa kết thúc một phần tử trước
đó Như vậy ví dụ sau không đúng:
< Product ProductID = >Chair</ Product >
< Product ProductID = '2" >Desk</ Product >
</ Catalog >
Các giá trị 1, 2 không nằm trong một cặp ngoặc kép, do đó tài liệu XML trên không đúng cú pháp Ta cần phải sửa lại như sau:
< Catalog >
< Product ProductID = "1" >Chair</ Product >
< Product ProductID = "2" >Desk</ Product >
</ Catalog >
Trang 12< FirstName >Graeme</ FirstName >
< LastName >Malcolm</ LastName >
</ Customer >
< Book >
< Title >Treasure Island</ Title >
< Author >Robert Louis Stevenson</ Author >
</ Book >
</ BookOrder >
2.1.2 Chỉ thị xử lý và ghi chú
Ngoài các dữ liệu cần thiết, một tài liệu XML còn chứa các chỉ thị xử lý cho
bộ phân tích và các ghi chú cho người đọc tài liệu
Chỉ thị xử lý (Processing Instruction) được đặt trong cặp thẻ <? và ?> thông
thường nó cho biết phiên bản của tài liệu XML mà bộ xử lý cần làm theo, đôi khi cho ta biết dạng mã hóa của dữ liệu trong tài liệu là gì, hoặc cách thức xác nhận tính hợp lệ của tài liệu Ví dụ:
<?xml version = "1.0" encoding = "utf-8" standalone = "yes" ?>
Trang 13- 12 -
Trong tài liệu trên giá trị của thuộc tính version bằng “1.0” cho ta biết phiên bản của tài liệu Giá trị của thuộc tính encoding bằng “utf-8” cho ta biết tài liệu được mã hóa ở chuẩn utf-8 Giá trị của thuộc tính standalone bằng “yes” cho ta biết tài liệu này có thể được xác nhận tính hợp lệ một mình mà không cần tới DTD hay Schema
Cũng có một loại chỉ thị xử lý khác cho ta biết khuân mẫu của tài liệu Ví dụ: <?xml-stylesheet type = "text/xsl" href = "order.xsl" ?>
Ở đây, XML stylesheet cho ta biết khuân mẫu của tài liệu thuộc loại
“text/xsl” và được chứa trong tệp “order.xsl”
Phần ghi chú cho tài liệu XML được đặt trong cặp thẻ <! và !> như sau:
<?xml version = "1.0" encoding = "utf-8" standalone = "yes" ?>
<! Below are details of a purchase order >
2.1.3 Không gian tên
Không gian tên (namespace) là một khái niệm rất quan trọng trong XML, nó cho ta phân biệt hai hay nhiều dữ liệu khác nhau của cùng một phần tử trong tài liệu XML Cũng giống như trong trường hợp hai người trùng tên để phân biệt hai người này ta phải dùng đến họ Xét trường hợp tài liệu XML sau:
Trang 14< FirstName >Graeme</ FirstName >
< LastName >Malcolm</ LastName >
</ Customer >
< Book >
< Title >Treasure Island</ Title >
< Author >Robert Louis Stevenson</ Author >
</ Book >
</ BookOrder >
Khi quan sát ví dụ trên, ta nhận thấy rất dễ gây nhầm lẫn trong cách dùng
phần tử Title, trong tài liệu này có 2 cách dùng Title: 1 cách chỉ về danh hiệu của
người mua (Mr Mrs Dr.) còn cách kia chỉ tựa đề của cuốn sách Để tránh nhầm lẫn
ta có thể sử dụng không gian tên để xác định phần tử này thuộc không gian tên nào Các không gian tên được định nghĩa bởi URI (Universal Resource Identifier), một URI cũng có thể là một URL hoặc là một định nghĩa riêng nào đó không nhất thiết phải là một địa chỉ Internet mà chỉ cần xác định duy nhất
Không gian tên có thể được khai báo thông qua thuộc tính xmlns như vậy
trong ví dụ ở trên ta có thể sửa lại thành:
< FirstName >Graeme</ FirstName >
< LastName >Malcolm</ LastName >
</ Customer >
< Book xmlns = "http://www.northwindtraders.com/book" >
< Title >Treasure Island</ Title >
< Author >Robert Louis Stevenson</ Author >
</ Book >
Trang 15< cust:FirstName >Graeme</ cust:FirstName >
< cust:LastName >Malcolm</ cust:LastName >
</ cust:Customer >
< book:Book >
< book:Title >Treasure Island</ book:Title >
< book:Author >Robert Louis Stevenson</ book:Author >
</ book:Book >
</ BookOrder >
Trong tài liệu XML trên ta dùng 3 không gian tên:
- Không gian tên mặc định http://www.northwindtraders.com/order;
- Không gian tên http://www.northwindtraders.com/customer (viết tắt là
cust)
- Không gian tên http://www.northwindtraders.com/book (viết tắt là book)
Trang 16- 15 -
Các phần tử, các thuộc tính không có tiền tố ở trước như BookOrder, OrderNo, và OrderDate, được coi như thuộc về không gian tên mặc định Để đánh dấu một phần tử hay thuộc tính không thuộc về không gian tên mặc định, một chữ viết tắt, đại diện không gian tên sẽ được gắn làm tiền tố cho tên phần tử hay thuộc
tính Thí dụ như cust:LastName, book:Title
2.1.4 CDATA và thực thể tham chiếu
CDATA là phần dữ liệu trong tài liệu XML nằm giữa <![CDATA[ và ]]>
Dữ liệu nằm bên trong những CDATA được giữ nguyên khi thông qua bộ phân tích, không bị sửa đổi Điểm nầy rất quan trọng khi ta muốn cho vào những dữ liệu có chứa những text được xem như các đoạn đánh dấu Ta có thể đặt những thí dụ cho XML trong những CDATA và chúng sẽ được bộ phân tích bỏ qua Khi dùng XSL stylesheets để chuyển đổi một tệp XML thành HTML, có bất cứ scripting nào bạn cũng phải đặt trong những CDATA Dưới đây là các thí dụ dùng CDATA:
<![CDATA[ Dữ liệu được đặt tại đây ]]>
< Order >
< OrderDate >2002-6-14</ OrderDate >
< Customer >Helen & Mooney</ Customer >
</ Order >
Trang 17- 16 -
Trong ví dụ trên, trong giá trị của Customer có ký tự & do đó tài liệu XML này không đúng cấu trúc, và sẽ không thể hiểu được khi đi qua bộ phân tích, vì thế cần thay thế nó bởi thực thể tham chiếu đến Tài liệu XML này có thể được viết lại như sau:
' dấu nháy đơn (‘)
> dấu lớn hơn (>)
< dấu nhỏ hơn (<)
" dấu ngoặc kép (“)
2.2 XPath và xử lý tài liệu XML
Ta nhận thấy cấu trúc và cú pháp của XML tương đối đơn giản Bước tiếp theo là tìm hiểu cách nào một chương trình xử lý một tài liệu XML
Để xử lý một tài liệu XML chương trình ứng dụng phải có cách đi lại bên trong tài liệu, lấy ra giá trị của các phần tử hay thuộc tính Do đó người ta thiết kế
ngôn ngữ XML Path language, mà ta gọi tắt là XPath XPath đóng một vai trò
quan trọng trong các chương trình ứng dụng vì nó cho phép ta lựa chọn hay sàng lọc
ra những tin tức nào mình muốn để trao đổi hay hiển thị
Nếu khi làm việc với cơ sở dữ liệu SQL Server ta dùng các câu lệnh SQL
như: Select * from Table XYZ WHERE để trích ra một số trường từ một bảng,
Trang 18có một lý thuyết rõ ràng, chính xác Ta sẽ chỉ tìm hiểu những thứ thường dùng trong XPath, còn tất cả chi tiết hơn về XPath thì có thể tham khảo tại: http://www.w3c.org/TR/xpath
2.2.1 Biểu diễn XML trong XPath
XPath cho ta cách đi lại bên trong tài liệu XML và coi tài liệu XML như là một cây (tree) với nhiều nhánh (nodes) Mỗi một phần tử hay một thuộc tính được coi như và một nhánh của cây Ta có thể minh họa như sau:
Trang 19- 18 -
(Hình 01: Hình minh họa cách thể hiện một tài liệu XML dạng cây)
2.2.2 Đường dẫn trong XML
Ta có thể dùng XPath để chỉ định đường đi hay vị trí (Location Path) đến
nhánh nào hay trích ra (trả về) một hay nhiều nhánh thỏa đúng điều kiện yêu cầu
Các biểu thức XPath có thể là tuyệt đối tức là lấy gốc làm chuẩn hay tương đối tức
là khởi đầu từ nhánh vừa mới được chọn Nhánh đó được gọi là nhánh tình huống
(context node)
Có hai cách viết để diễn tả vị trí bằng XPath là viết nguyên và viết tắt Trong
cả hai cách ta đều dùng dấu slash (/) để nói đến Document Element, tức là gốc Ta
có thể đi lại trong các nhánh của cây giống giống như các nhánh của Windows System Directory mà ta thấy trong Panel bên trái của Window Explorer Ta cũng sẽ
dùng những ký hiệu như slash (/), một chấm (.) và hai chấm ( ) của Windows
System File Folder cho cách viết tắt trong vị trí trong XPath để đi xuống các nhánh con, cháu, chỉ định nhánh ngữ cảnh, hay đi ngược lên các nhánh tổ tiên
Trang 20- 19 -
2.2.2.1 Đường dẫn tuyệt đối
Ta lấy ví dụ là tài liệu XML trong mục 2.2.1 và đi tìm một số các đường dẫn
tuyệt đối trong tài liệu này Muốn chọn cái nhánh của phần tử Order (nó cũng là
Root Element) bằng cú pháp nguyên, ta sẽ dùng cú pháp XPath sau đây:
/child::Order
Cũng có thể viết tắt lại thành: /Oder
Để đi ra nhánh của cây, chẳng hạn đi tìm nhánh Customer bằng cách dùng
cú pháp XPath sau:
/child::Order/child::Customer
Cũng có thể viết tắt lại thành: /Order/Customer
Nếu ta muốn lấy ra một thuộc tính của nhánh, bạn phải chỉ rõ điều này bằng
cách dùng từ khóa (keyword) attribute trong cách viết nguyên hay dùng ký tự @
trong cú pháp tắt Do đó để lấy thuộc tính OrderNo của phần tử Order, ta sẽ dùng
cú pháp XPath sau:
/child::Order/attribute::OrderNo
Hoặc dùng cú pháp tắt sau: /Order/@OrderNo
Để trích ra các nhánh con cháu, tức là các nhánh xa hơn, ta dùng từ khóa
descendant trong cú pháp nguyên hay một double slash (//) trong cú pháp tắt Thí
dụ, để lấy ra các nhánh Product trong tài liệu, ta có thể dùng cú pháp XPath sau:
/child::Order/descendant::Product
Cú pháp tắt tương đương là: /Order//Product
Đối với những nhánh mà tên của chúng không thành vấn đề, để lấy những nhánh này ta có thể dùng ký tự * để thay thế Thí dụ, dùng dấu * để lấy tất cả các nhánh con của Order, cú pháp XPath như sau:
/child::Order/child::* Cú pháp tắt tương đương là: /Order/*
Trang 21- 20 -
2.2.2.2 Đường dẫn tương đối
Nhiều khi đường dẫn trong Xpath là tương đối với nhánh ngữ cảnh, trong trường hợp ấy đường dẫn diễn tả cách lấy ra một nhánh hay một số nhánh tương
đối Thí dụ, nếu phần tử Item thứ nhất trong Order là nhánh ngữ cảnh, thì đường dẫn tương đối để trích ra phần tử con Quantity được thể hiện bởi cú pháp Xpath
sau:
child::Quantity
Cú pháp tắt tương đương là: Quantity
Tương tự như vậy, để lấy ra thuộc tính ProductID của phần tử con Product,
thì cú pháp Xpath của đường dẫn tương đối là:
child::Product/attribute::ProductID
Cú pháp tắt tương đương là: Product/@ProductID
Để đi ngược lên phía trên của cây, ta dùng từ khóa parent (cha) Dạng tắt tương đương của từ khóa này là hai dấu chấm ( ) Thí dụ nếu nhánh ngữ cảnh là
phần tử OrderDate, thì thuộc tính OrderNo có thể được lấy ra từ phần tử Order
bằng cách sử dụng cú pháp Xpath tương đối sau:
Hoặc cú pháp tắt tương đương là: /@OrderNo
Ngoài ra, ta có thể nói đến chính nhánh ngữ cảnh bằng cách dùng từ khóa
self hoặc một dấu chấm (.) trong trường hợp cú pháp tắt Điều này rất tiện trong vài
trường hợp, nhất là khi ta muốn biết nhánh ngữ cảnh trước đó là nhánh nào
Trang 22- 21 -
2.2.2.3 Đường dẫn và điều kiện
Ta có thể giới hạn số nhánh lấy về bằng cách gắn thêm điều kiện sàng lọc vào đường dẫn Điều kiện này được gắn vào cú pháp XPath bên trong một cặp
ngoặc vuông ([]) Thí dụ, để lấy ra mọi phần tử Product có thuộc tính UnitPrice lớn
hơn 70, bạn có thể dùng cú pháp XPath sau đây:
/child::Order/child::Item/child::Product[attribute::UnitPrice>70]
Cú pháp tắt tương đương là: /Order/Item/Product[@UnitPrice>70]
Trong cú pháp của điều kiện ta cũng có thể dùng XPath tương đối , do đó trong cú pháp điều kiện ta có thể dùng bất cứ nhánh nào Thí dụ sau đây là cú pháp
XPath lấy về những nhánh Item có phần tử con Product với thuộc tính ProductID
Vì các thuộc tính của một phần tử không có thứ tự, nên chúng có thể nằm lộn xộn trong một Collection Một Collection được xem như một mảng (Array) Muốn trực tiếp đến một nhánh nào đó trong Collection ta có thể dùng một chỉ mục (index) trong cặp ngoặc vuông Nhánh thứ nhất có chỉ mục là 1 Ví dụ sau:
Trang 23- 22 -
Author[1] trả về phần tử Author đầu tiên
Author[FirstName][3] phần tử Author thứ 3 có một phần tử con là FirstName
2.2.4 Từ khóa và các phép toán
2.2.4.1 Từ khóa
Trong cú pháp của đường dẫn trong XPath các từ khóa được dùng để chỉ các mối liên hệ giữa các nhánh và được dùng trong nhánh ngữ cảnh Dưới đây là bảng liệt kê các từ khóa
Ancestor:: Tổ tiên của nhánh ngữ cảnh, bao gồm có cha, ông nội, ông cố
.v.v., do đó từ khóa ancestor:: luôn luôn kể cả nhánh gốc trừ khi
chính nhánh ngữ cảnh là nhánh gốc
ancestor-or-self::
Chính nhánh ngữ cảnh và tổ tiên của nó Từ khóa
ancestor-or-self:: luôn luôn kể cả nhánh gốc
attribute:: Các thuộc tính của nhánh ngữ cảnh
child:: Con cái của nhánh ngữ cảnh Tuy nhiên, thuộc tính hay không
gian tên của nhánh không được xem là con cái của nhánh ngữ cảnh
descendant:: Con cháu của nhánh ngữ cảnh Từ khóa descendant:: không bao
giờ chứa thuộc tính hay không gian tên của nhánh
following:: Mọi nhánh hiện ra sau nhánh ngữ cảnh trên cây, không kể con
cháu, thuộc tính, hay không gian tên của nhánh
following-sibling::
Mọi nhánh nằm ngay sau nhánh ngữ cảnh Từ khóa
following-sibling:: chỉ những nhánh con, của cùng một nhánh cha, nằm
Trang 24- 23 -
trên cây sau nhánh ngữ cảnh Nếu nhánh ngữ cảnh là thuộc tính
hay không gian tên thì following-sibling:: sẽ trả về giá trị rỗng
namespace:: Những không gian tên của nhánh ngữ cảnh
parent:: Nhánh cha của nhánh ngữ cảnh nếu nó có cha Nhánh cha là
nhánh nằm ngay phía trên context node trên cây
preceding:: Mọi nhánh hiện ra trước nhánh ngữ cảnh trên cây, không kể các
nhánh tổ tiên, thuộc tính, hay không gian tên Một cách để nhận
diện từ khóa preceding:: mọi nhánh đã kết thúc hoàn toàn trước
khi nhánh ngữ cảnh bắt đầu
preceding-sibling::
Mọi nodes anh (nằm trước) nhánh ngữ cảnh Từ khóa
preceding-sibling:: nói đến chỉ những nhánh con, của cùng một
nhánh cha, nằm trên cây và trước nhánh ngữ cảnh Nếu nhánh
ngữ cảnh là thuộc tính hay không gian tên thì
preceding-sibling:: trống rỗng
self:: Là chính nhánh ngữ cảnh
2.2.4.2 Phép toán sàng lọc (Filter)
Như ta đã thấy ở trên, để giới hạn chỉ lấy ra những nhánh thỏa đáng một điều
kiện, lọc các dữ liệu (Filter) vào Collection Sàng lọc là mệnh đề giống mệnh đề WHERE trong ngôn ngữ SQL của cơ sở dữ liệu
Nếu một Collection nằm giữa một filter, nó sẽ cho kết quả TRUE nếu Collection trả về ít nhất một nhánh và FALSE nếu Collection trống rỗng (empty) Filters luôn luôn được tính theo ngữ cảnh của nó Ta có thể hiểu rõ thông qua các thí dụ sau:
Trang 25- 24 -
book[excerpt] Mọi phần tử book có chứa ít nhất một phần tử
excerpt book[excerpt]/title Mọi phần tử title nằm trong những phần tử book
có chứa ít nhất một phần tử excerpt book[excerpt]/author[degree] Mọi phần tử author có chứa ít nhất một phần tử
degree và nằm trong những phần tử book có chứa
ít nhất một phần tử excerpt book[author/degree] Mọi phần tử book có chứa ít nhất một phần tử
author với ít nhất một phần tử degree con book[excerpt][title] Mọi phần tử book có chứa ít nhất một phần tử
author[lastname = "Smith"] Mọi phần tử author có chứa ít nhất một
phần tử lastname với trị số bằng Smith
author[lastname[1] = "Smith"] Mọi phần tử author có có phần tử
lastname con đầu tiên với trị số bằng Smith
Trang 26- 25 -
author/degree[@from != "Harvard"] Mọi phần tử degree, là con một phần tử
author, và có một thuộc tính from với trị
số không phải là "Harvard"
author[lastname = /editor/lastname] Mọi phần tử author có chứa một phần tử
lastname bằng với phần tử lastname là con của gốc editor
author[ = "John"] Mọi phần tử author có trị số là “John” 2.2.4.4 Phép toán hội (Union)
Trong ngôn ngữ Xpath hỗ trợ phép toán hội (Operator Union), giống như
phép toán Logical OR (hoặc là) Dưới đây là vài thí dụ:
(book | magazine)/price Mọi phần tử price là con của phần tử
book hay phần tử magazine 2.2.4.5 Các phép toán khác
Để chọn những loại nhánh khác hơn là nhánh phần tử, ta dùng Node-Type Test Mục đích của việc dùng Node-Type Test là để chỉ định sự lựa chọn khác thường Thí dụ như, descendant::text() cho ta mọi text nhánh là con cháu của
Trang 27- 26 -
nhánh ngữ cảnh, dù rằng loại nhánh chính của con cháu nhánh ngữ cảnh là phần tử
Có 4 loại Node-Type Tests như liệt kê dưới đây:
comment() Mọi ghi chú của
nhánh
following::comment() chọn mọi ghi
chú của nhánh hiện ra sau nhánh ngữ cảnh
hiện ra trước nhánh ngữ cảnh
processing-instruction()
Mọi chỉ thị xử lý của nhánh
self::processing instruction() chọn
mọi chỉ thị xử lý nhánh trong nhánh ngữ cảnh
text() Mọi text của
./author Mọi phần tử author trong ngữ cảnh trước
cú pháp này tương đương với author
/bookstore Phần tử gốc tên là bookstore
//author Mọi phần tử tên là author trong tài liệu
book[/bookstore/@specialty =
@style]
Mọi phần tử book có thuộc tính style với giá trị bằng giá trị của thuộc tính specialty của phần tử gốc bookstore của tài liệu
Trang 28Mọi phần tử emph bất cứ nơi nào dưới excerpt
là con của những phần tử book , bất cứ nơi nào dưới phần tử bookstore
.//title Mọi phần tử title một hay nhiều bậc thấp hơn
trong nhánh ngữ cảnh
author/* Mọi phần tử là con của các phần tử con author book/*/lastname Mọi phần tử lastname là cháu của các phân từ
con của phần tử book
*[@specialty] Mọi phần tử con có thuộc tính specialty
@style Thuộc tính style của nhánh ngữ cảnh
price/@exchange Thuộc tính exchange của những phần tử price
trong ngữ cảnh, tức là những phần tử price của
nhánh ngữ cảnh
price/@exchange/total Trả về một tập rỗng, vì thuộc tính không có
phần tử con Cú pháp này được chấp nhận trong
Trang 29- 28 -
văn phạm của XML Path Language, nhưng không thật sự hợp lệ
book[@style] Mọi phần tử book có thuộc tính style trong
nhánh ngữ cảnh Lưu ý phần nằm trong ngoặc vuông là điều kiện của phần tử book
book/@style Thuộc tính style của mọi phần tử book trong
nhán ngữ cảnh Ở đây không có điều kiện như hàng trên Ta nói đến thuộc tính hay phần tử nằm bên phải nhất
author[1] Phần tử author thứ nhất trong nhánh ngữ cảnh author[firstname][3] Phần tử author thứ ba có một phần tử con
firstname
my:book Phần tử book từ không gian tên my
my:* Mọi phần tử trong không gian tên my
Trang 30- 29 -
Chương 3 SQL SERVER VÀ DỮ LIỆU XML 3.1 SQL Server và kiểu dữ liệu XML
Cùng với sự phát triển của XML, các hệ quản trị cơ sở dữ liệu bắt đầu có sự
hỗ trợ cho ngôn ngữ này Điển hình là việc hệ quản trị cơ sở dữ liệu SQL Server đã coi XML như là một kiểu dữ liệu, và ngày càng cải tiến khả năng hỗ trợ cho loại ngôn ngữ này
Ở SQL Server 2000, ta có thể nhận được dữ liệu quan hệ ở dạng XML với cú pháp: FOR XML, hoặc lưu trữ XML như dữ liệu quan hệ trong SQL Server sử dụng mệnh đề OPEN XML Cho tới SQL Server 2005 có thêm một kiểu dữ liệu mới là XML cho phép ta viết mã nhận dữ liệu XML như là XML, tránh việc biến đổi từ XML thành dữ liệu quan hệ khi dùng OPEN XML Cũng từ phiên bản SQL Server
2005, ta cũng có thể dùng tài liệu giản đồ biểu diễn trong ngôn ngữ W3C XML Schema Definition (đôi khi gọi là giản đồ XSD) để chỉ ra cấu trúc hợp lệ trong XML Từ đó mở ra nhiều hướng tiếp cận cho dữ liệu XML trong hệ quản trị cơ sở
dữ liệu này
3.2 Khai phá dữ liệu XML trong SQL Server
3.2.1 Cách sinh ra một tài liệu XML trong SQL Server
Trong SQL Server, để tạo ra một tài liệu XML ta sử dụng cú pháp sau:
Để tìm hiểu kỹ hơn, ta từng bước đi vào từng cú pháp trong cú pháp lệnh SQL trên Ta thực hành trên CSDL Northwind với các bảng dữ liệu Customer, Products, Order details
Trước tiên, ta tìm hiểu cú pháp lệnh:
FOR XML RAW [('ElementName')] }
FOR XML {{RAW [('ElementName')] |AUTO}|EXPLICIT|PATH [('ElementName')] } [,BINARY BASE64]
[,TYPE]
[,ROOT[('RootName')]
Trang 31- 30 -
Cú pháp này cho kết quả là một tài liệu XML phân mảnh (không có phần tử gốc) và các phần tử XML này sử dụng chung một định danh nằm trong thẻ <row /> trong trường hợp sử dụng định danh khác cho thẻ thì ta sẽ truyền định danh này vào với dạng ‘ElementName’ Ví dụ:
Kết quả như sau:
< row CustomerID = BOLID " ContactName = Martín Sommer " Country = Spain " />
< row CustomerID = FISSA " ContactName = Diego Roel " Country = Spain " />
< row CustomerID = GALED " ContactName = Eduardo Saavedra " Country = Spain "
WHERE Country = 'Spain'
FOR XML RAW( 'CustomerInfo' )
Kết quả như sau:
< CustomerInfo CustomerID = BOLID " ContactName = Martín Sommer "
Trang 32Trong trường hợp dữ liệu được truy vấn từ nhiều bảng kết quả trả về là tài liệu xml phân mảnh trong đó mỗi phần tử XML có tên là bảng đầu tiên được truy vấn đến, có thuộc tính là các trường dữ liệu tồn tại trong bảng đó và các phần tử con
là các bảng tiếp theo được truy vấn, các phần tử con này cũng chứa thuộc tính là các trường dữ liệu trong bảng tiếp theo, ví dụ:
Ví dụ 3:
SELECT P ProductID , ProductName , UnitPrice = ROUND ( UnitPrice , 2 ),
Quantity ,
Discount = CONVERT (int, Discount * 100 ),
ExtendedPrice = ROUND ( CONVERT (money, Quantity *( 1 - Discount ) *
P UnitPrice ), 2 )
FROM Products P , [Order Details] Od
WHERE Od ProductID = P ProductID and Od OrderID = 10248
FOR XML RAW
Kết quả như sau:
< row ProductID = 11 " ProductName = Queso Cabrales " UnitPrice = 21.0000 " Quantity = 12 " Discount = 0 ExtendedPrice = 252.0000 " />
< row ProductID = 42 " ProductName = Singaporean Hokkien Fried Mee "
UnitPrice = 14.0000 " Quantity = 10 " Discount = 0
ExtendedPrice = 140.0000 " />
< row ProductID = 72 " ProductName = Mozzarella di Giovanni "
UnitPrice = 34.8000 " Quantity = 5 Discount = 0 ExtendedPrice = 174.0000 "
Kết quả như sau:
< Customers CustomerID = BOLID " ContactName = Martín Sommer "
Trang 33- Cột đầu tiên phải ở dạng số nguyên và duy nhất đối với từng dòng dữ liệu ( thường là kiểu ID), tên của cột sẽ trở thành thẻ
- Cột thứ hai cung cấp một số thẻ của phần tử cha, và tên cột này sẽ trở thành cha, bằng cách này các thẻ sẽ cung cấp các thông tin cho ta
- Các cột còn lại sẽ mang các giá trị cùng với các thông tin trong tên cột và dùng để tạo ra các dữ liệu XML, và ta cũng có thể định dạng lại các dữ liệu này để
có được các tài liệu XML khác nhau thông qua các chỉ thị
Chẳng hạn, để đưa ra được kết quả như trong ví dụ 5 ta phải làm như sau:
Ví dụ 5:
SELECT P ProductID , ProductName , UnitPrice = ROUND ( UnitPrice , 2 ),
Quantity ,
Discount = CONVERT (int, Discount * 100 ),
ExtendedPrice = ROUND ( CONVERT (money, Quantity *( 1 - Discount ) *
P UnitPrice ), 2 )
FROM Products P , [Order Details] Od
WHERE Od ProductID = P ProductID and Od OrderID = 10248
FOR XML AUTO
Kết quả như sau:
< ProductID = 11 " ProductName = Queso Cabrales " UnitPrice = 21.0000 " > < Od Quantity = 12 " Discount = 0 ExtendedPrice = 252.0000 " />
Trang 34- 33 -
Ngoài ra ta có thể hiển thị tài liệu XML theo cách khác thông qua việc sử dụng thêm một số các chỉ thị dịch khác, chẳng hạn chỉ thị Element biến giá trị của phần tử thành giá trị của thuộc tính:
Ví dụ 6:
SELECT 1 AS Tag , NULL AS Parent , P ProductID AS [P!1!ProductID] ,
P ProductName AS [P!1!ProductName] , P UnitPrice AS [P!1!UnitPrice] ,
NULL AS [Od!2!Quantity] , Null as [Od!2!Discount] , null as
[Od!2!ExtendedPrice]
FROM Products P , [Order Details] Od
WHERE Od ProductID = P ProductID and Od OrderID = 10248
UNION ALL
SELECT 2 AS Tag , 1 AS Parent , P ProductID , P ProductName , P UnitPrice ,
Quantity , Discount = CONVERT (int, Discount * 100 ),
ExtendedPrice = ROUND ( CONVERT (money, Quantity *( 1 - Discount ) *
P UnitPrice ), 2 )
FROM Products P , [Order Details] Od
WHERE Od ProductID = P ProductID and Od OrderID = 10248
ORDER BY [P!1!ProductID] , [Od!2!Quantity]
FOR XML EXPLICIT
Kết quả như sau:
< ProductID = 11 " ProductName = Queso Cabrales " UnitPrice = 21.0000 " > < Od Quantity = 12 " Discount = 0 ExtendedPrice = 252.0000 " />