Lập trình web nâng cao XML - Trường CĐN Đà Lạt - 7

primary-key

</xsd:appinfo>

</xsd:annotation>

</xsd:unique>

</xsd:element>

Ở đây, chúng ta có thêm phần tử <annotation> trong phần tử <unique> để trình xử lý dễ dàng kèm thêm thuộc tính primary-key với phần tử tương ứng.

Bên trong khóa chính, rất nhiều thuộc tính và các siêu dữ liệu (metadata) của cơ sở dữ liệu không dễ dàng có thể mô hình trực tiếp bằng cách sử dụng các phần tử XSD. Một ví dụ quan trọng là tất cả các thông tin liên quan được định nghĩa như là các chỉ số. Dĩ nhiên, chúng ta có thể sử dụng kỹ thuật <appinfo> <annotation>.

Một cột duy nhất được mô hình bây giờ là DeptID. Trong bảng Dept, DeptID được định nghĩa là khóa ngoại. Ngôn ngữ XSD định nghĩa hoàn chỉnh để xử lý cho vấn đề này, phần tử

<key> và <keyref>. <keyref> được hiểu như là khóa ngoại trong khi <key> được hiểu là khóa chính. Chúng ta mô hình trường DeptID như sau:

<xsd:element name="DeptID" use="required" type="xsd:int">

<xsd:keyref name="DeptKeyRef" refer="DeptKey">

<xsd:selector xpath="my:Employee"/>

<xsd:field xpath="DeptID"/>

</xsd:keyref>

</xsd:element>

Cần chú ý rằng, cú pháp <keyref> rất giống với <unique>, trong đó chúng ta sử dụng hai phần tử con <selector> và <field> để chỉ định đâu là khóa liên kết và vùng nào nó phải duy nhất. thuộc tính refer được sử dụng đề chỉ định tên của phần tử <key> nó sẽ tham chiếu ngược lại. Khi chúng ta mô hình trường DeptID của bảng Dept, chúng ta sử dụng phần tử

<key> kèm theo như là DeptKey.

Bây giờ, chúng ta mô hình XSD cho bảng Employee, chúng ta có thể di chuyển sang bảng Dept. Mô hình trường DeptName thì đơn giản bởi vì nó giống như trường FirtName của bảng Employee:

<xsd:element name="DeptName" type="varchar20"/>

Trường DeptID được định nghĩa là khóa chính trong bảng Dept. Chúng ta thật sự biết cách khóa chính như phần tử <EmployeeID>, chúng ta dễ dàng thực hiện như sau:

<xsd:element name="DeptID" use="required" type="xsd:int"/>

<xsd:unique name="DeptUnique">

<xsd:selector xpath="my:Dept"/>

<xsd:field xpath="DeptID"/>

<xsd:annotation>

<xsd:appinfo> primary-key

</xsd:appinfo>

</xsd:annotation>

</xsd:unique>

Một phần thông tin vẫn còn thiếu. Chúng ta cần thêm phần tử <key> vào đâu như cách định nghĩa <keyref> định nghĩa trong phần tử con <DeptID> của phần tử <Employee>. Định nghĩa cuối cùng cho phần tử <DeptID> như sau:

<xsd:element name="DeptID" use="required" type="xsd:int"/>

<xsd:unique name="DeptUnique">

<xsd:selector xpath="my:Dept"/>

<xsd:field xpath="DeptID"/>

<xsd:annotation>

<xsd:appinfo> primary-key

</xsd:appinfo>

</xsd:annotation>

</xsd:unique>

<xsd:key name="DeptKey">

<xsd:selector xpath="my:Dept"/>

<xsd:field xpath="DeptID"/>

</xsd:key>

</xsd:element>

Sau đây là kết quả cuối cùng: employee_dept.xsd

<?xml version="1.0"?>

<xsd:schema xmlns:xsd="http://www.w3c.org/2001/XMLSchema" targetNamespace="http://mspress.microsoft.com/corexml/" xmlns:my="http://mspress.microsoft.com/corexml/">

<xsd:element name="ROOT">

<xsd:complexType>

<xsd:sequence>

<xsd:element ref="Employee" minOccurs="0" maxOccurs="unbounded"/>

<xsd:element ref="Dept" minOccurs="0" maxOccurs="unbounded"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:simpleType name="varchar20">

<xsd:restriction base="xsd:string">

<xsd:maxLength value="20"/>

</xsd:restriction>

</xsd:simpleType>

<xsd:element name="Employee">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="EmployeeID" use="required" type="xsd:int">

<xsd:unique name="EmployeeUnique">

<xsd:selector xpath="my:Employee"/>

<xsd:field xpath="EmployeeID"/>

<xsd:annotation>

<xsd:appinfo> primary-key

</xsd:appinfo>

</xsd:annotation>

</xsd:unique>

</xsd:element>

<xsd:element name="FirstName" type="varchar20"/>

<xsd:element name="LastName" use="required" type="varchar20"/>

<xsd:element name="DeptID" use="required" type="xsd:int">

<xsd:keyref name="DeptKeyRef" refer="DeptKey">

<xsd:selector xpath="my:Employee"/>

<xsd:field xpath="DeptID"/>

</xsd:unique>

</xsd:element>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

<xsd:element name="Dept">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="DeptID" use="required" type="xsd:int"/>

<xsd:unique name="DeptUnique">

<xsd:selector xpath="my:Dept"/>

<xsd:field xpath="DeptID"/>

<xsd:annotation>

<xsd:appinfo>

primary-key

</xsd:appinfo>

</xsd:annotation>

</xsd:unique>

<xsd:key name="DeptKey">

<xsd:selector xpath="my:Dept"/>

<xsd:field xpath="DeptID"/>

</xsd:key>

</xsd:element>

<xsd:element name="DeptName" type="varchar20"/>

</xsd:sequence>

</xsd:complexType>

</xsd:element>

</xsd:schema>

Phát sinh một giản đồ cơ sở dữ liệu từ giản đồ XSD:

Việc làm này thực sự đơn giản, chúng ta có thể liệt kê các bảng dưới phần tử <ROOT>. Với mỗi bảng được liệt kệ chúng ta phát sinh một câu lệnh CREATE TABLE cho kịch bảng SQL của chúng ta:

CREATE TABLE Employee (

)

CREATE TABLE Dept (

)

Bây giờ, chúng ta cần thực hiện các bảng này bằng cách mô hình cấu trúc của chúng như XSD. Bắt đầu, với bảng Employee bởi vì nó là bảng đầu tiên được liệt kê trong

<ROOT>. Mỗi một bảng được mô hình mởi một phần tử <complextype> và mỗi cột được mô hình bởi phần tử con. Chúng ta thấy bảng Employee cần bốn cột.

Mỗi cột trong bảng này sẽ tương ứng với một phần tử con của <Employee>. Thêm vào tên của chúng, chúng ta cũng thấy những thông tin khác về những cột này, giống như: bắt buộc, duy nhất hay cả hai. Chúng ta cần phát sinh định nghĩa cột tương ứng trong kịch bảng SQL. Chú ý rằng, thuộc tính bắt buộc của phần tử được mô tả bằng cách sử dụng NOT NULL trong kịch bản SQL .

CREATE TABLE Employee (

EmployeeID INT NOT NULL, FirstName VARCHAR( 20 ),

LastName VARCHAR( 20 ) NOT NULL, DeptID INT NOT NULL

)

Trở lại với tài liệu Employee_Dept.xsd, chúng ta thấy EmployeeID có một phần tử unique và một thông tin primary-key. Như chúng ta thấy, ta sử dụng thêm thông tin để nói lên rằng đây là phần tử khóa chính. Hãy thêm thông tin vào kịch bảng SQL của chúng ta:

EmployeeID INT PRIMARY KEY NOT NULL,

Bây giờ, đến phần mô hình khóa ngoại. Chúng ta thấy từ định nghĩa DeptID trong phần tử <Employee> là nó có một <keyref> đến một <key> gọi là DeptKey. Trong ví dụ trên được thể hiện trong kịch bảng SQL như sau:

DeptID INT REFERENCES Dept( DeptID ) NOT NULL

Chúng ta đã hoàn thiện việc mô hình của bảng Employee, giờ chúng ta chuyển sang bảng Dept.

Bắt đầu, chúng ta thêm một cột vào giản đồ cơ sở dữ liệu cho mỗi phần tử định nghĩa trong <Dept><complexType>.


CREATE TABLE Dept (

DeptID INT NOT NULL,

Name VARCHAR( 20 ) NOT NULL

)

Bây giờ, chúng ta thấy rằng DeptID phải được định nghĩa là khóa chính bởi vì được ấn định primary-key <appinfo><annotation>. Kết quả đạt được như sau:

generated_db_schema.sql CREATE TABLE Employee (

EmployeeID INT PRIMARY KEY NOT NULL,

FirstName VARCHAR( 20 ),

LastName VARCHAR( 20 ) NOT NULL,

DeptID INTEGER REFERENCES Dept(DeptID) NOT NULL

)

CREATE TABLE Dept (

DeptID INT PRIMARY KEY NOT NULL, Name VARCHAR( 20 ) NOT NULL

)

- Lưu trữ và nhận các tài liệu XML trung tâm tài liệu:

Cung cấp cho các tài liệu XML trung tâm tài liệu trong đa số RDBMS thường rất nhỏ. Ví dụ minh họa một tài liệu HTML trung tâm tài liệu:

sample_html.html


<html>

<head>

<title>Sample HTML</title>

</head>

<body>

<h1>This is a header</h1> Some other text

<p>This is a paragraph.</p>

<p>This is <b>another</b> paragraph.</p>

</body>

</html>

Đa số RDBMS khuyến cáo rằng lưu trữ các tài liệu XML trung tâm tài liệu dưới cột đối tượng ký tự lớn (Character Large Object - CLOB) hoặc BLOB trong cơ sở dữ liệu quan hệ.

- Cung cấp XML trong hệ thống cơ sở dữ liệu thương mại:

Chúng ta bàn luận vấn đề này trong hai cơ sở dữ liệu thương mại điện tử tốt nhất bây

giờ:


+ Microsoft SQL Server 2000

SQL Server 2000 cung cấp một host cung cấp các thành phần dựng sẵn để hỗ trợ XML.

Nó cho phép người sử dụng chuyển đổi dữ liệu quan hệ sang tài liệu XML. Thêm vào đó, SQL Server 2000 có một bộ máy cập nhật cơ sở dữ liệu sử dụng XML:

SQL Server 2000 provides a host of built-in features for delivering XML support. Most of these concentrate on enabling the user to translate relational data into XML documents. In addition, SQL Server 2000 has a mechanism for updating databases using XML.

Sử dụng SELECT FOR XML để xuất khẩu dữ liệu quan hệ sang XML

SQL Server 2000 cung cấp mệnh đề mới cho câu lệnh SELECT nhằm có thể xuất khẩu tập kết quả trong dữ liệu quan hệ sang XML. Khả năng này cho phép xuất khẩu tập kết quả được sinh ra bởi bất kỳ câu lệnh truy vấn sang tài liệu XML. Nó cũng loại trừ việc chúng ta viết bất kỳ mã lệnh tùy biến nào để chuyển dữ liệu của tập kết quả sang XML.

Mệnh đề FOR XML cung cấp 3 chế độ RAW, AUTO và EXPLICIT để điều khiển kết quả XML.

Chế độ RAW

Chế độ này đơn giản nhất trong ba chế độ. Đáng tiếc, nó cũng chứa đựng nhiều hạn chế. Chế độ RAW cung cấp một ánh xạ một-một sáng XML.

Chúng ta bắt đầu với một ví dụ đơn giản. Câu truy vấn dưới đây sẽ trả về tất cả các dòng trong bảng Employees.

SELECT EmployeeID, FirstName, LastName

FROM Employees

Bảng Employees và tất cả các bảng khác được đề cập trong tài liệu này sẽ có thể tìm thấy trong cơ sở dữ liệu mẫu Northwind được cài đặt sẵn trong SQL2000.

Kết quả được minh họa như sau:

Để trả về một XML chúng ta có thể thêm mệnh đề FOR XML RAW trong câu lệnh 1

Để trả về một XML chúng ta có thể thêm mệnh đề FOR XML RAW trong câu lệnh truy vấn SQL.

raw.sql

SELECT EmployeeID, FirstName, LastName FROM Employees

FOR XML RAW

Kết quả trả về như sau: raw.xml

<row EmployeeID="1" FirstName="Nancy" LastName="Davolio"/>

<row EmployeeID="2" FirstName="Andrew" LastName="Fuller"/>

<row EmployeeID="3" FirstName="Janet" LastName="Leverling"/>

<row EmployeeID="4" FirstName="Margaret" LastName="Peacock"/>

<row EmployeeID="5" FirstName="Steven" LastName="Buchanan"/>

<row EmployeeID="6" FirstName="Michael" LastName="Suyama"/>

<row EmployeeID="7" FirstName="Robert" LastName="King"/>

<row EmployeeID="8" FirstName="Laura" LastName="Callanan"/>

<row EmployeeID="9" FirstName="Annee" LastName="Dodsworth"/>

Như chúng ta thấy, bất kỳ tài liệu XML nào được trả về bởi FOR XML không tự động bao gồm bất kỳ mở đầu nào, chẳng hạn như <?xml version = “1”?> và một phần tử gốc.

Chế độ RAW chuyển mỗi dòng trong tập kết quả sang phần tử <row>. Mỗi cột được trả về dưới dạng một thuộc tính với cùng tên. Một hạn chế lớn của chế độ RAW là nó không thể phát sinh tài liệu XML phân cấp từ một tập kết quả nhiều bảng. Để minh họa hạn chế này, chúng ta sẽ xét câu truy vấn nhiều bảng sau:

multitable.sql

SELECT Customers.CustomerID, Customers.CompanyName, Orders.OrderID, Orders.OrderDate,

[Order Details].ProductID, [Order Details].Quantity, [Order Details].UnitPrice

FROM Customers, Orders, [Order Details]

WHERE Customers.CustomerID = Orders.CustomerID AND Orders.OrderID = [Order Details].OrderID

AND Customers.CustomerID = 'BOLID'

ORDER BY Customers.CustomerID, Orders.OrderID Kết quả được minh họa trong bảng sau:

Chúng ta thêm FOR XML RAW vào câu lệnh truy vấn trên Kết quả sẽ như sau raw2 xml 2

Chúng ta thêm FOR XML RAW vào câu lệnh truy vấn trên. Kết quả sẽ như sau: raw2. xml

<row CustomerID="BOLID" CompanyName="Bolido Comidas preparadas" OrderID="10326" OrderDate="1996-10-10T00:00:00" ProductID="4"

Quantity="24" UnitPrice="17.6"/>

<row CustomerID="BOLID" CompanyName="Bolido Comidas preparadas" OrderID="10326" OrderDate="1996-10-10T00:00:00" ProductID="57"

Quantity="16" UnitPrice="15.6"/>

<row CustomerID="BOLID" CompanyName="Bolido Comidas preparadas" OrderID="10326" OrderDate="1996-10-10T00:00:00" ProductID="75"

Quantity="50" UnitPrice="6.2"/>

<row CustomerID="BOLID" CompanyName="Bolido Comidas preparadas" OrderID="10801" OrderDate="1997-12-26T12:00:00" ProductID="17"

Quantity="40" UnitPrice="39"/>

<row CustomerID="BOLID" CompanyName="Bolido Comidas preparadas" OrderID="10801" OrderDate="1997-12-26T12:00:00" ProductID="29"

Quantity="20" UnitPrice="123.79"/>

<row CustomerID="BOLID" CompanyName="Bolido Comidas preparadas" OrderID="10970" OrderDate="1998-03-24T00:00:00" ProductID="52"

Quantity="40" UnitPrice="7"/>

Giống như chúng ta thấy, kết quả này không phản ánh sự phân cấp của tập kết quả rằng Order Details nằm dưới Customer. May mắn thay, chế độ AUTO sẽ có khả năng cung cấp sự phản ánh này.

Chế độ AUTO

Chế độ này cho phép chúng ta xuất ra tài liệu XML phân cấp. auto.sql

SELECT Customers.CustomerID, Customers.CompanyName, Orders.OrderID, Orders.OrderDate,

[Order Details].ProductID, [Order Details].Quantity, [Order Details].UnitPrice

FROM Customers, Orders, [Order Details]

WHERE Customers.CustomerID = Orders.CustomerID AND Orders.OrderID = [Order Details].OrderID

AND Customers.CustomerID = 'BOLID'

ORDER BY Customers.CustomerID, Orders.OrderID FOR XML AUTO

Tài liệu XML sẽ được phát sinh như sau: auto.xml

<Customers CustomerID="BOLID" CompanyName="Bolido Comidas preparadas">

<Orders OrderID="10326" OrderDate="1996-10-10T00:00">

<Order_Details ProductID="4" Quantity="24" UnitPrice="17.6"/>

<Order_Details ProductID="57" Quantity="16" UnitPrice="15.6"/>

<Order_Details ProductID="75" Quantity="50" UnitPrice="6.2"/>

</Orders>

<Orders OrderID="10801" OrderDate="1997-12-26T00:00">

<Order_Details ProductID="17" Quantity="40" UnitPrice="39"/>

<Order_Details ProductID="29" Quantity="20" UnitPrice="123.79"/>

</Orders>

<Orders OrderID="10801" OrderDate="1997-12-26T00:00">

<Order_Details ProductID="52" Quantity="40" UnitPrice="7"/>

</Orders>

</Customers>

Trong chế độ AUTO, mỗi bảng từ mệnh đề FROM được mô tả bởi một phần tử XML tương ứng. Các cột được liệt kê trong câu truy vấn sẽ được ánh xạ thành các thuộc tính tương ứng của các phần tử. Trong cấu trúc trên, tài liệu XML đã có sự phân cấp,

<Customers> chứa các phần tử <Orders>, <Orders> chứa các phàn tử <Order_Details>.

Chế độ EXPLICIT

Chế độ EXPLICIT của mệnh đề FOR XML được thiết kế để cho phép người dùng điều khiển kiểu dáng của XML. Câu truy vấn phải được viết thêm thông tin về sự lồng ghép mong đợi. Chỉ dẫn của SQL Server 2000 có thể chỉ định thêm thông tin ở mức cột. Ví dụ, người sử dụng có thể chỉ định cột nào là phần tử hay thuộc tính trong XML.

Chế độ EXPLICIT chỉ dẫn kết quả của câu lệnh SQL sang định dạng chỉ định. Tập kết cả này gọi là Universal Table (bảng vũ trụ - viết tắt là UT (người dịch)).

Hai cột mở rộng được yêu cầu bởi chế độ EXPLICIT phải có tên Tag và Parent.

Tag phải được chỉ định cho một đầu tiên trong UT và được sử dụng để chỉ định số tag của phần tử hiện tại. Tag là một số nguyên và nó bắt đầu bởi 1.

Cột thứ 2 trong UT phải được gọi là Parent. Nó cũng được chỉ định bởi một số tag cho phần tử parent. Parent cũng là một số nguyên. Để chỉ định một phần tử không có cha, chúng ta sử dụng giá trị 0 hay NULL.

Có hai phần tử phân cấp cha-con trong ví dụ sau: skeletal1.xml

<Customers ...>

...

<Orders ...>

...

<Details ...>

...

</Details>

...

</Orders>

...

</Customers>

Bảng liệt kê tag của các phần tử

Eleme

nt


ag

P

arent

Custo mers


0

Order

s


1

Detail

s


2

Có thể bạn quan tâm!

Xem toàn bộ 258 trang tài liệu này.

Sau khi cột Tag và Parent, chúng ta cần thêm dữ liệu cho mỗi cột trong XML. Ví dụ, phân rã XML cần bốn cột bởi vì có các mục dữ liệu: CustomerID, ContactName, OrderID, và OrderDate.

<Customers CustomerID="..." ContactName="...">

...

<Orders OrderID="..." OrderDate="..."/>

...

</Customers>

Các cột này trong UT phải được đặt tên như một quy định ngầm. Mỗi cột được chuyển tên theo quy tắc:

ElementName!TagNumber!AttributeName![Directive] ElementName tên của cột.

TagNumber chỉ định số tag của cột.

AttributeName chỉ định tên của thuộc tính hay phần tử trong XML.

Directive là tùy chọn, nó cho biết cách thức chuyển đổi cột trong XML. Ví dụ, một cột được phát sinh thành thuộc tính trong XML một cách mặc định. Chỉ định Directive thành “element”, cột sẽ được chuyển thành phần tử con. Ngoài ra, nó còn cho phép rất nhiều tùy chọn.

Ví dụ, hai dữ liệu CustomerID và ContactName, theo sự phân rã XML diễn tả bởi tên cột, Customers!1!CustomerID và Customers!1!ContactName.

<Customers CustomerID="..." ContactName="...">

...

Mỗi dòng trong UT nhận biết một sự xuất hiện của một phần tử trong tài liệu XML kết quả. Do đó, có rất nhiều dòng trong UT như số lượng các phần tử trong XML kết quả.

Chúng ta biết 10 phần tử xuất hiện (một sự xuất hiện của <Customers> cộng ba

<Orders> và sáu <Order_Details>), chúng ta cần 10 dòng trong UT. Bảng sau liệt kê các giá trị tag và parent:


ag

P

arent


0


1


2


2


1


2


1


2


2


2

Tiếp theo, chúng ta định nghĩa các cột khác. Từ tài liệu XML, chúng ta thấy có bảy dữ liệu (CustomerID, CompanyName, OrderID, OrderDate, ProductID, Quantity, and UnitPrice), chúng ta cần bảy cột mở rộng trong UT để diễn giải các dữ liệu này. Chúng ta xem bảng liệt kê sau:

AUTO.xml

Phần tử chứa

Số tag của phần tử chứa

Tên phần tử

Tên cột của UT

<Customer

s>

1

Custome

rID

Customers!1!CustomerI

D

<Customer

sk>

1

Contact Name

Customers!1!Company Name

<Orders>

2

OrderID

Orders!2!OrderID

<Orders>

2

OrderDat

e

Orders!2!OrderDate

Xem tất cả 258 trang.

Ngày đăng: 19/11/2023
Trang chủ Tài liệu miễn phí