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


<Order_Det ails>

3

ProductI

D

Order_Details!3!Product

ID

<Order_Det ails>

3

Quantity

Order_Details!3!Quantit

y

<Order_Det ails>

3

UnitPrice

Order_Details!3!UnitPric

e

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

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

Chúng ta hoàn tất việc định nghĩa các cột cho UT của chúng ta. Chúng ta cũng biết có bao nhiêu cột và các giá trị tag và parent tương ứng của chúng.

Dòng đầu tiên tương ứng với sự xuất hiện đầu tiên của phần tử <Customers> và chúng ta cần phải lưu trữ giá trị tìm thấy trong các thuộc tính CustomerID và Contactname của nó trong cột Customers!1!CustomerID và Customers!1!CompanyName. Chú ý rằng, chúng ta cho phép các cột rỗng (với một giá trị NULL) bởi vì chúng không có dữ liệu trong phần tử hiện tại.

Dòng thứ 2 tương ứng với sự xuất hiện của phần tử <Orders> trong XML. Tại thời điểm này, chúng ta thêm giá trị lưu trữ trong các thuộc tính OrderID và OrderDate của nó vào các cột tương ứng Orders!2!OrderID và Orders!2!OrderDate. Chúng ta cũng có thể cho phép các cột trắng. Chú ý rằng, chúng ta lặp lại giá trị cho cột CustomerID từ dòng trước nhưng để cột Company trống. Chúng ta xem bảng dưới đây để xem rõ hơn:

Trong dòng thứ 3 chúng ta gặp sự xuất hiện đầu tiên của phần tử Order Details 1

Trong dòng thứ 3, chúng ta gặp sự xuất hiện đầu tiên của phần tử <Order_Details>. Cũng theo luật tương tự đã đề cập ở trên, chúng ta có thể điền dữ liệu cho dòng này. Chú ý rằng vào thời điểm này, chúng ta đã sao chép cả hai giá trị của cột CustomerID và OrderID từ dòng trước trong khi chúng ta để Companyame và OrderDate trống.

Dòng thứ 4 và 5 tương tự như dòng 3.

Giờ chúng ta đã hoàn thành sự xuất hiện đầu tiên của <Order> và gặp sự xuất hiện của dòng thứ 2. Chúng ta dùng luật tương tự như đã xây dựng 5 dòng trước.

Bây giờ, chúng ta bàn về việc sử dụng câu lệnh UNION ALL: explicit.sql

SELECT 1 AS Tag,

0 AS Parent,

CustomerID AS [Customers!1!CustomerID], CompanyName AS [Customers!1!ContactName],

NULL AS [Orders!2!OrderID], NULL AS [Orders!2!OrderDate],

NULL AS [Order_Details!3!ProductID], NULL AS [Order_Details!3!Quantity], NULL AS [Order_Details!3!UnitPrice]

FROM Customers

WHERE CustomerID = 'BOLID' UNION ALL

SELECT 2,

1,

CustomerID, NULL,

Orders.OrderID, Orders.OrderDate, NULL,

NULL, NULL

FROM Orders, Customers

WHERE Orders.CustomerID = Customers.CustomerID AND Customers.CustomerID = 'BOLID'

UNION ALL SELECT 3,

2,

CustomerID, NULL,

OrderID, NULL,

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

FROM Orders, Customers, [Order Details]

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

AND Customers.CustomerID = 'BOLID'

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

Câu lệnh đầu tiên, truy vấn tất cả giá trị thuộc tính cho phần tử <Customers>. Chúng ta cũng cho bí danh cho các cột tương ứng để chuyển đổi tên cho UT. Chú ý rằng giá trị của các tất cả các cột không liên quan gì đến phần tử <Customers> được đặt thành NULL. Cuối cùng, giá trị cho các cột tag và parent được yêu cầu, trong trường hợp này là 0 và 1.

Trong câu lệnh truy vấn thứ hai, truy vấn tất cả giá trị thuộc tính cho phần tử <Orders>. Chú ý rằng chúng ta nối hai bảng Orders và Customers lại với nhau và chúng ta sử dụng cùng một điều kiện chọn của dòng Customers như ta đã dùng cho câu truy vấn đầu tiên. Bước này chắc chắn rằng Customers chúng ta tìm thấy trong câu lệnh truy vấn này khớp với câu truy vấn đầu tiên. Cũng cần chú ý rằng, ngoại trừ CustomerID, tất cả các cột khác không liên quan gì với phần tử <Orders> được đặt thành NULL. Chúng ta cũng gán giá trị 2 và 1 cho cột tag và parent.

Trong câu lệnh truy vấn cuối cùng, truy vấn tất cả các giá trị thuộc tính cho phần tử

<Order_Details>. Chú ý rằng tại thời điểm này, chúng ta đã giữ lại cột của cả hai cột CustomerID và OrderID và tất cả các cột không liên quan đến <Order_Details> được đặt thành NULL. Chúng ta cũng cài đặt cùng một quan hệ giữa bảng Customers và Orders như câu truy vấn trước.

Trong chế độ EXPLICIT, tập kết quả mô tả bảng UT được quét trên một dòng từ trên xuống dưới, sản xuất ra cây XML kết quả. Chúng ta cũng có thể sử dụng mệnh đề ORDER BY để chắn chắn rằng các dòng có thứ tự trong tập kết quả.

Các mẫu XML

SQL Server 2000 cung cấp một thành phần mới, gọi là mẫu XML (XML Templates), chúng ta có thể sử dụng để gói kết quả của truy vấn FOR XML hoặc các thủ tục lưu trữ (stored procedure) vào một tài liệu XML đúng. Các mẫu XML cũng cung cấp một thành phần cao cấp như các tham số thực thi và cung cấp cho XSLT.

Một mẫu XML là một tài liệu XML chứa các câu lệnh truy vấn hoặc các thủ tục lưu trữ để thực thi. Ví dụ sau cho chúng ta cách thể gói một câu truy vấn chế độ RAW để trả về các dòng của bảng Employees:

xml_template.xml

<?xml version="1.0"?>

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<sql:query>

SELECT EmployeeID, FirstName, LastName FROM Employees

FOR XML RAW

</sql:query>

</ROOT>

Phần tử <ROOT> là phần tử gốc của tài liệu XML kết quả. Chúng ta có thể đổi thành cái khác theo ý của chúng ta, chẳng hạn như <Customers>. Phần tử gốc này giúp tạo nên tài liệu XML đúng. Chú ý rằng chúng ta cũng bao gồm không gian tên mẫu XML được định nghĩa trong phần tử <ROOT>. Các mẫu XML của SQL Server 2000 XSD được định nghĩa bởi URI: urn:schemas-microsoft-com:xml-sql.

Như chúng ta thấy, chúng ta có thể sử dụng phần tử <query> để chỉ định một câu lệnh truy vấn hay một nội hàm để thực thi. Chúng ta có thể có nhiều phần tử <query> và kết quả của tất cả các câu truy vấn sẽ cùng nhau trong tài liệu XML cuối cùng.

Bây giờ, chúng ta thật sự muốn thực thi mẫu XML của mình để nhận tài liệu XML kết quả. Một phương pháp được SQL Server 2000 cung cấp để hoàn thành điều này là sử dụng một URL HTTP. Thành phần này yêu cầu phải tải lên một virtual directory (thư mục ảo) và một virtual name (tên ảo) cho mẫu trong Internet Information Server (IIS) bằng cách sử dụng công cụ IIS, chúng ta có thể đọc kỹ hơn trong tài liệu của SQL Server 2000. Một khi chúng ta đã cấu hình đúng, chúng ta có thể thực thi mẫu XML của chúng ta bằng cách sử dụng URL tương tự như sau:

http://localhost/nwind/templates/XML_Template1.xml

Trong URL trên, nwind và templates là ví dụ cho virtual directory và virtual name. Kết quả của tài liệu XML được mở trong trình duyệt như sau:

xml_template_result.xml

<?xml version="1.0"?>

<ROOT xmlns:sql="urn:schemas-microsoft-com:xml-sql">

<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"/>

</ROOT>

Như chúng ta thấy, SQL Server 2000 thực thi câu lệnh truy vấn theo chế độ RAW và chèn kết quả vào trong phần tử <ROOT>.

XML View (Khung nhìn XML)

Với người sử dụng cần nhiều dạng XML khác nhau nhưng sử dụng chế độ EXPLICIT quá khó. SQL Server 2000 cung cấp một thành phần mới được gọi là khung nhìn XML. Khung nhìn XML là cách đơn giản ánh xạ một XML với cơ sở dữ liệu quan hệ cho phép người sử dụng để đa dạng XML. Thêm vào đó, các khung nhìn XML được tạo ra bằng cách sử dụng tập con của ngôn ngữ XPath. Phương pháp này giống như việc tạo ra các khung nhìn SQL bằng cách sử dụng lệnh CREATE VIEW.

Trong XML, ánh xạ khung nhìn XML – cơ sở dữ liệu quan hệ được chỉ định thông qua một số của Microsoft định nghĩa thêm các chú thích vào ngôn ngữ giản đồ XSD. Những chú thích này cho phép người sử dụng chỉ định ánh xạ giữa phần tử và thuộc tính trong giản đồ XSD đến các bảng và cột trong cơ sở dữ liệu. Nó cũng được sử dụng để chỉ định sự phân cấp trong XML. Ví dụ, giả sử chúng ta muốn sử dụng các bảng và quan hệ của chúng để phát sinh tài liệu XML trong ví dụ trên nhưng lại muốn tập kết quả giống như sau:

xml_view.xml

<Customer CustomerID="BOLID">

<Name>Bolido Comidas preparadas</Name>

<Order OrderID="10326">

<Date>1996-10-10T00:00</Date>

<Item>

<ProductID>4</ProductID>

<Quantity>24</Quantity>

<Price>17.6</Price>

</Item>

<Item>

<ProductID>57</ProductID>

<Quantity>16</Quantity>

<Price>15.6</Price>

</Item>

<Item>

<ProductID>75</ProductID>

<Quantity>50</Quantity>

<Price>6.2</Price>

</Item>

</Order>

<Order OrderID="10801">

<Date>1997-12-26T00:00</Date>

<Item>

<ProductID>17</ProductID>

<Quantity>40</Quantity>

<Price>39</Price>

</Item>

<Item>

<ProductID>29</ProductID>

<Quantity>20</Quantity>

<Price>123.79</Price>

</Item>

</Order>

<Order OrderID="10970">

<Date>1998-03-24T00:00</Date>

<Item>

<ProductID>52</ProductID>

<Quantity>40</Quantity>

<Price>7</Price>

</Item>

</Order>

</Customer>

Để phát sinh được một tài liệu XML như vậy, SQL Server 2000 yêu cầu rằng chúng ta phải chỉ định một XSD với các chú thích ánh xạ tương ứng. XSD đặc biệt này gọi là giản đồ ánh xạ. Các chú thích còn được sử dụng để chỉ định các phần tử XML tương ứng với cột của nó trong một bảng của cơ sở dữ liệu. Nó cũng cho phép chỉ định quan hệ cha-con giữa các bảng.

Giản đồ XSD cho ứng dụng của chúng ta được liệt kê như sau. Chú ý rằng các chú thích được liệt kê thuộc về không gian tên SQL Server 2000 XML, tên là urn:schemas- microsoft-com:mapping-schema.

xml_view.xsd

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">

<xsd:element name="Customer" sql:relation="Customers">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="Name" sql:field="CompanyName" type="xsd:string" />

<xsd:element ref="Orders" sql:relationship="relOrders"/>

</xsd:sequence>

<xsd:attribute name="CustomerID" sql:field="CustomerID" type="xsd:string"/>

</xsd:complexType>

</xsd:element>

<xsd:element name="Order" sql:relation="Orders">

<xsd:complexType>

<xsd:sequence>

<xsd:element name="Date" sql:field="OrderDate" type="xsd:dateTime"/>

<xsd:element ref="Item" sql:relationship="relItems"/>

</xsd:sequence>

<xsd:attribute name="OrderID" type="xsd:int"/>

</xsd:complexType>

</xsd:element>

<xsd:element name="Item" sql:relation="Order Details">

<xsd:complexType>

<xsd:element name="ProductID" sql:field="ProductID" type="xsd:string"/>

<xsd:element name="Price" sql:field="UnitPrice" type="xsd:int"/>

<xsd:element name="Quantity" sql:field="Quantity" type="xsd:int"/>

</xsd:complexType>

</xsd:element>

<xsd:annotation>

<xsd:appinfo>

<sql:relationship name="relOrders"

parent="Customers" parent-key="CustomerID" child="Orders"

child-key="CustomerID"/>

<sql:relationship name="relDetails"

parent="Orders" parent-key="OrderID" child="Order Details" child-key="OrderID"/>

</xsd:appinfo>

</xsd:annotation>

</xsd:schema>

Để chỉ định ánh xạ giữa các phần tử trong XML và các cột trong bảng cơ sở dữ liệu, chúng ta sử dụng thuộc tính sql:field attribute. Bảng chứa các cột này có thể tìm thấy tại thuộc tính sql:relation. Ví dụ, sự phân rã sau định nghĩa một phần tử phức tạp <Item> có các phần tử con <ProductID>, <Price>, và <Quantity> ánh xạ với các trường ProductID, UnitPrice, và the Quantity của bảng Details:

<xsd:element name="Item" sql:relation="Order Details">

<xsd:complexType>

<xsd:element name="ProductID" sql:field="ProductID" type="xsd:string"/>

<xsd:element name="Price" sql:field="UnitPrice" type="xsd:int"/>

<xsd:element name="Quantity" sql:field="Quantity" type="xsd:int"/>

</xsd:complexType>

</xsd:element>

Để tạo sự phân cấp XML, chúng ta chỉ định phần tử <sql:relationship>.

Đầu tiên, chúng ta cần chỉ định các bảng/khung nhìn được liên kết. Những quan hệ liên kết này được định nghĩa trong chú <sql:relationship>. Ví dụ như sau:

<sql:relationship name="relOrders"

parent="Customers" parent-key="CustomerID" child="Orders"

child-key="CustomerID"/>

Với mỗi quan hệ liên kết hay liên kết bảng, chúng ta định nghĩa bằng một phần tử

<sql:relationship>. Một thuộc tính name được sử dụng duy nhất trong quan hệ này. Những bảng mà có cột được định nghĩa là quan hệ chúng ta sử dụng các thuộc tính parent, parent- key, child, và child-key. Như sự phân rã ở trên, chúng ta kết nối bảng Orders với bảng Customers bằng cột CustomerID cho mỗi bảng như là khóa. Điều này thể hiện trong mệnh đề WHERE như sau:

WHERE Customers.CustomerID = Orders.CustomerID

Bây giờ, chúng ta kết nối bằng cách định nghĩa như ví dụ sau:

<xsd:element ref="Item" sql:relationship="relItems"/>

Chúng ta đã hoàn thiện giản đồ, giờ làm thế nào để SQL Server 2000 tạo một tài liệu XML sử dụng giản đồ này? Ví dụ, để thực hiện câu lệnh SELECT WHERE Customers.CustomerID = `BOLID' chúng ta sử dụng ví dụ đơn giản như sau trong tài liệu XML_view.xml:

/Customer[@CustomerID='BOLID']

Chúng ta có thể giới hạn tài liệu XML trả về chỉ là danh sách các phần tử <Item> mà không có phần tử <Customer> và <Order>. Biểu thức Xpath như sau:

/Customer[@CustomerID='BOLID'/Order/Item] Kết quả trả về sẽ như sau:

<Item>

<ProductID>918234</ProductID>

<Price>12.00</Price>

<Quantity>4</Quantity>

</Item>

<Item>

<ProductID>170018</ProductID>

<Price>20.00</Price>

<Quantity>2</Quantity>

</Item>

<Item>

<ProductID>100144</ProductID>

<UnitPrice>49.95</UnitPrice>

<Quantity>10</Quantity>

</Item>

<Item>

<ProductID>710050</ProductID>

<UnitPrice>199.95</UnitPrice>

<Quantity>1</Quantity>

</Item>

<Item>

<ProductID>918234</ProductID>

<UnitPrice>12.00</UnitPrice>

<Quantity>10</Quantity>

</Item>

<Item>

<ProductID>001460</ProductID>

<UnitPrice>299.95</UnitPrice>

<Quantity>1</Quantity>

</Item>

Sử dụng OPENXML

SQL Server 2000 còn có thành phần cung cấp tập kết quả gọi là OPENXML. Thành phần này có thể hữu ích khi chúng ta muốn gởi một tài liệu XML như là một tham số cho một câu lệnh SQL hay một thủ tục lưu trữ và sau đó chèn các dữ liệu tìm thấy trong tài liệu vào các bảng quan hệ tương ứng.

Về chức năng, OPENXML tương tự như các bộ cung ứng kết quả khác như OPENQUERY và OPENROWSET. Điểm khác biệt chính là với OPENXML, chúng ta có thể sử dụng một thủ tục lưu trữ đặc biệt để chuẩn bị tài liệu XML và xóa nó ra khỏi bộ nhớ với một thủ tục lưu trữ khác khi công việc đã hoàn thành.


Để chuẩn bị cho tài liệu XML, chúng ta có thể gọi thủ tục lưu trữ sp_xml_prepareDocument. Nó tải tài liệu XML, chuyển vào thông qua tham số chuỗi, vào trong bộ nhớ, chuẩn bị để tối ưu hoạt động truy vấn và chuyển sang tập kết quả. sp_xml_prepareDocument trả về một giá trị INT, nó là thẻ quản của XML trong bộ nhớ. Khi công việc hoàn thành, chúng ta gọi thủ tục lưu trữ sp_xml_removeDocument để giải phóng bộ nhớ.

Kịch bản SQL sau sẽ cho chúng ta một ví dụ đơn giản để chìn bản ghi sử dụng OPENXML.

openxml.sql

DECLARE @xmlHnd INT

DECLARE @xmlDoc VARCHAR( 1000 )

-- prepare the XML document SET @xmlDoc =

'<ROOT>

<Employees EmployeeID="2" FirstName="Albert" LastName="Adams"/>

<Employees EmployeeID="4" FirstName="Ed" LastName="Davis"/>

<Employees EmployeeID="10" FirstName="Joe" LastName="Young"/>

</ROOT>'

-- Load and parse the XML document

EXEC sp_xml_prepareDocument @xmlHnd OUTPUT, @xmlDoc

-- Insert the three Employees record specified in the XML INSERT Employees SELECT *

FROM OPENXML( @xmlHnd, '/ROOT/Employees', 0 )

WITH ( EmployeeID INT, FirstName VARCHAR( 20 ), LastName VARCHAR( 20 )

)

-- release reference to the XML document EXEC sp_xml_removeDocument @hXmlDoc

Để chuyển tài liệu XML bởi thẻ quản trả về nhờ sp_xml_prepareDocument sang tập kết

quả, chúng ta sử dụng hàm OPENXML. Cú pháp của hàm này như sau:


OPENXML( Handle, XPath[, Attributes] ) WITH SchemaDeclaration Handle là giá trị thẻ quản được trả về bởi sp_xml_prepareDocument.

XPath là biểu thức Xpath được sử dụng để chỉ định nút trong tài liệu XML sẽ nằm trong tập kết.

Attributes là tùy chọn. Chỉ định 0 hoặc 2 để trả về kết quả theo ánh xạ phần tử hay thuộc

tính.


SchemaDeclaration xác định giản đồ để sử dụng phát sinh tập kết quả. Trong ví dụ openxml.sql ở trên, lời gọi hàm OPENXML như sau: OPENXML( @xmlHnd, '/ROOT/Employees', 0 ) WITH Employees

Mã lệnh này chỉ định rằng tài liệu XML của chúng ta được nhận định bởi thẻ quản

xmlHnd, trả về dạng ánh xạ thuộc tính và các nút nắm dưới ROOT/Employees.

- Oracle 9i

SQL Server 2000 không phải là cơ sở dữ liệu duy nhất hỗ trợ mạnh XML. Oracle 9i cũng cung cấp một số công cụ mạnh mẽ để xây dựng ứng dụng XML. Tuy nhiên, so với SQL Server 2000, những thành phần này có vẻ rắc rối hơn và thường yêu cầu tính chất lập trình.

Các thành phần XML được hỗ trợ bởi Oracle 9 có thể tìm thấy trong Oracle XML Development Kits (XDK).

Oracle tạo XDK cho Java, C/C++ và PL/SQL. Các thành phần cung cấp trong XDK gồm trình phân giải XML, trình xử lý XLST và các công cụ khác. Một trong những công cụ này là tiện ích XML SQL (XSU), dùng để phát sinh các tài liệu XML từ câu truy vấn SQL.

Oracle 9i cũng cung cấp một kiểu dữ liệu mới gọi là XMLType, nó phù hợp cho cả hai loại tài liệu XML trung tâm dữ liệu và trung tâm tài liệu.

Ví dụ sau là kịch bảng SQL để tạo và phát sinh các bảng: oracle_script.sql

-- create and populate the Dept table CREATE TABLE Dept

(

Dept_No NUMBER PRIMARY KEY Dept_Name VARCHAR2( 20 ) NOT NULL

);

/

INSERT INTO Dept VALUES ( 1, `IT' );

/

INSERT INTO Dept VALUES ( 2, `Marketing' );

/

INSERT INTO Dept VALUES ( 3, `HR' );

/

INSERT INTO Dept VALUES ( 4, `Accounting' );

/

INSERT INTO Dept VALUES ( 5, `Operations' );

/

-- create and populate the Employee table CREATE TABLE Employee

(

Employee_No NUMBER PRIMARY KEY, First_Name VARCHAR2( 20 ), Last_Name VARCHAR2( 20 ) NOT NULL,

Dept_No NUMBER REFERENCES Dept( Dept_No )

);

/

INSERT INTO Employee VALUES ( 1, 'Sean', 'Chai', 1 )

/

INSERT INTO Employee VALUES ( 2, 'Aaron', 'Con', 1 )

/

INSERT INTO Employee VALUES ( 3, 'Andrew', 'Dixon', 2 )

/

INSERT INTO Employee VALUES ( 4, 'Ted', 'Bremer', 3 )

/

INSERT INTO Employee VALUES ( 5, 'Randall', 'Boseman', 4 )

/

INSERT INTO Employee VALUES ( 6, 'Jane', 'Clayton', 1 )

/

INSERT INTO Employee VALUES ( 7, 'Peter', 'Connelly', 2 )

/

INSERT INTO Employee VALUES ( 8, 'Eva', 'Corets', 3 )

/

INSERT INTO Employee VALUES ( 9, 'Nate', 'Sun', 5 )

/

Tiện ích XML SQL

XSU cung cấp như là một phần của Oracle XDK và được thiết kế để thực hiện 3 nhiệm vụ sau:

Phát sinh một tài liệu XML từ bất kỳ câu truy vấn SQL hay đối tượng Java JDBC nào.

Trích dữ liệu từ một tài liệu XML và chèn vào các cột/thuộc tính của một bảng hay một khung nhìn tương ứng.

..... Xem trang tiếp theo?
⇦ Trang trước - Trang tiếp theo ⇨

Ngày đăng: 19/11/2023