Quản lý các lược đồ XML trong DB2 Phần 1: Quản lý các lược đồ XML và xác nhận hợp lệ dữ liệu XML Giới thiệu Các từ viết tắt thông dụng SQL: Ngôn ngữ truy vấn có cấu trúc W3C: Hi
Trang 1Quản lý các lược đồ XML trong DB2 Phần 1: Quản lý các lược đồ XML và xác nhận hợp lệ
dữ liệu XML
Giới thiệu
Các từ viết tắt thông dụng
SQL: Ngôn ngữ truy vấn có cấu trúc
W3C: Hiệp hội Mạng toàn cầu
XML: Ngôn ngữ đánh dấu mở rộng
XSD: Định nghĩa lược đồ XML
Lược đồ XML do W3C đề xuất cung cấp nhiều cách biểu diễn vị trí của một lược đồ XML (sau
đây gọi là vị trí lược đồ) Chỉ rõ vị trí lược đồ để nhận được lược đồ XML, khi bạn xác nhận hợp
lệ dữ liệu XML, và khi một lược đồ XML chứa hay nhập khẩu nó W3C nói rằng vị trí lược đồ chỉ là một gợi ý và một số bộ xử lý và các ứng dụng sẽ có lý do để không sử dụng nó
Vì vậy DB2 cung cấp hai cách để nhận được lược đồ XML khi bạn xác nhận hợp lệ dữ liệu XML Một là sử dụng vị trí lược đồ do W3C định nghĩa Cách khác là sử dụng một ID duy nhất
được gọi là ID quan hệ được đưa vào trong DB2 (Hình 1)
Hình 1 Quản lý các lược đồ XML trong DB2 (Kho lưu trữ Lược đồ XML)
Các bài viết trong loạt bài này
Phần 2: Quá trình phát triển lược đồ XML và quản lý dữ liệu XML: Khám phá ba cách duy trì dữ liệu XML và các lược đồ XML để đáp ứng nhu cầu thay đổi về nghiệp vụ của bạn
Có một số kiểu các lược đồ XML Bài viết này có các kiểu sau, và sử dụng các ví dụ để giới thiệu cách đăng ký các lược đồ XML, cách xác nhận hợp lệ dữ liệu XML, cách nhận được lược
đồ XML thường dùng để xác nhận hợp lệ dữ liệu XML, và v.v
Trang 2 Lược đồ XML không có vùng tên
o Ví dụ: customer1.xsd (lược đồ XML) trong Liệt kê 1, customer1.xml (dữ liệu XML) trong Liệt kê 7
Lược đồ XML không có vùng tên, tham khảo lược đồ XML khác không có vùng tên
o Ví dụ: customer2.xsd, company2.xsd (lược đồ XML) trong Liệt kê 2 và Liệt kê 3, customer2.xml (dữ liệu XML) trong Liệt kê 11
Lược đồ XML có một vùng tên
o Ví dụ: customer3.xsd (lược đồ XML) trong Liệt kê 4, customer3.xml (dữ liệu XML) trong Liệt kê 12
Lược đồ XML có một vùng tên, tham khảo một lược đồ XML có một vùng tên khác
o Ví dụ: customer4.xsd, company4.xsd (lược đồ XML) trong Liệt kê 5 và Liệt kê 6, customer4.xml (dữ liệu XML) trong Liệt kê 13
Về đầu trang
Đăng ký lược đồ XML
Thực hiện các bước sau đây để đăng ký một lược đồ XML trong DB2
1 Đăng ký lược đồ XML (lệnh REGISTER XMLSCHEMA)
Lưu ý: Lệnh DB2 không phân biệt chữ hoa, chữ thường Dữ liệu XML và các vị trí lược
đồ có phân biệt chữ hoa, chữ thường Liệu vị trí vật lý như '/work/customer1.xsd' có phân biệt chữ hoa, chữ thường không còn phụ thuộc vào hệ điều hành (Windows không phân biệt chữ hoa, chữ thường Linux và UNIX phân biệt chữ hoa, chữ thường)
2 Thêm các lược đồ XML được bao gồm hay được nhập khẩu (lệnh ADD XMLSCHEMA)
a Lưu ý: Bạn cũng có thể thêm các lược đồ XML ở bước 1 bằng cách sử dụng các tùy chọn lệnh khi bạn đăng ký lược đồ XML chính
3 Xác nhận hợp lệ và kích hoạt lược đồ XML đã đăng ký (lệnh COMPLETE
XMLSCHEMA)
Để giải thích các bước trên một cách chi tiết, các ví dụ về các kiểu của các lược đồ XML được hiển thị dưới đây
Một lược đồ XML không có vùng tên
customer1.xsd trong Liệt kê 1 là một ví dụ về một lược đồ XML không có vùng tên
Liệt kê 1 customer1.xsd (lược đồ XML)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
Trang 3<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
Để đăng ký một lược đồ XML trong DB2, bạn cần phải chỉ rõ một vị trí lược đồ và một ID quan
hệ có liên quan đến lược đồ XML này ID (Mã định danh) quan hệ có một tên lược đồ giống như một tên bảng ID quan hệ cho lược đồ XML (trong Liệt kê 1) được giả định là
SAMPLE.CUSTOMER1, và vị trí lược đồ được giả định là customer1.xsd Ban hành lệnh sau để đăng ký lược đồ XML này (Giả sử rằng lược đồ XML này được định nghĩa trong tệp
/work/customer1.xsd Sau đây, giả thiết các tệp cần thiết được lưu trong /thư mục làm việc)
REGISTER XMLSCHEMA 'customer1.xsd' FROM '/work/customer1.xsd' AS
SAMPLE.CUSTOMER1;
Sau đó ban hành lệnh sau để xác nhận hợp lệ lược đồ XML và kích hoạt nó:
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER1;
Với tài liệu tham khảo của bạn, để loại bỏ lược đồ XML, ban hành lệnh sau đây:
DROP XSROBJECT SAMPLE.CUSTOMER1;
Một lược đồ XML không có vùng tên, tham khảo một lược đồ XML khác không có vùng tên
Khi cả lược đồ XML đang tham khảo và lược đồ XML được tham khảo đều không có vùng tên hoặc khi cả hai lược đồ XML có cùng vùng tên, bạn có thể xác định vị trí lược đồ của lược đồ XML được tham khảo bằng phần tử include trong lược đồ XML đang tham khảo Trong DB2,
cả hai lược đồ XML được lưu trữ trong kho lưu trữ bằng cách sử dụng vị trí lược đồ và ID quan
hệ của lược đồ đang tham khảo Nhưng cả hai lược đồ XML đều được xác định bên trong Kho lưu trữ Lược đồ XML (XML Schema Repository) Để làm như vậy, DB2 sử dụng vị trí lược đồ được chỉ rõ bằng phần tử include được gọi là vị trí lược đồ bên trong trong bài viết này Điều
đó nói lên rằng, DB2 quản lý lược đồ XML được tham khảo trong vị trí lược đồ đang tham khảo
và ID quan hệ bằng cách sử dụng vị trí lược đồ bên trong (Hình 2)
Trang 4Hình 2 Vị trí lược đồ được sử dụng bên trong Kho lưu trữ Lược đồ XML
customer2.xsd trong Liệt kê 2 là một lược đồ XML không có vùng tên, tham khảo company2.xsd trong Liệt kê 3 không có vùng tên
Liệt kê 2 customer2.xsd (lược đồ XML)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="company2.xsd"/>
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element ref="company-name"/>
<xs:element ref="company-address"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
Liệt kê 3 company2.xsd (lược đồ XML)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company-name" type="xs:string"/>
<xs:element name="company-address" type="xs:string"/>
</xs:schema>
ID quan hệ thường dùng để lưu trữ cả hai lược đồ XML được giả định này là
SAMPLE.CUSTOMER2, và vị trí lược đồ được giả định là customer2.xsd
Bước đầu tiên là đăng ký customer2.xsd, lược đồ XML đầu tiên
Trang 5REGISTER XMLSCHEMA 'customer2.xsd' FROM '/work/customer2.xsd' AS
SAMPLE.CUSTOMER2;
Bước tiếp theo là thêm lược đồ XML company2.xsd Khi thêm nó, hãy chỉ rõ một vị trí lược đồ được sử dụng để quản lý lược đồ XML bên trong của Kho lưu trữ Lược đồ XML Vị trí lược đồ này phải giống hệt với vị trí lược đồ quy định trong giá trị thuộc tính schemaLocation của phần
tử include (trong ví dụ này là company2.xsd) DB2 sử dụng vị trí lược đồ này để nhận được các lược đồ XML đã bao gồm khi lược đồ XML này được xác nhận hợp lệ
ADD XMLSCHEMA DOCUMENT TO SAMPLE.CUSTOMER2 ADD 'company2.xsd' FROM
'/work/company2.xsd';
Cuối cùng, hãy ban hành lệnh sau để xác nhận hợp lệ lược đồ XML và kích hoạt nó:
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER2;
Lược đồ XML có vùng tên
customer3.xsd trong Liệt kê 4 là một lược đồ XML có vùng tên
http://www.sample.com/customer
Liệt kê 4 customer3.xsd (lược đồ XML)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/customer"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
Cách để đăng ký lược đồ XML này cũng giống như cách đăng ký một lược đồ XML không có vùng tên Giả sử ID quan hệ là SAMPLE.CUSTOMER3, và vị trí lược đồ là customer3.xsd, hãy ban ban hành lệnh sau để đăng ký lược đồ XML:
REGISTER XMLSCHEMA 'customer3.xsd' FROM '/work/customer3.xsd' AS
SAMPLE.CUSTOMER3;
Trang 6Ban hành lệnh sau để xác nhận hợp lệ lược đồ XML và kích hoạt nó:
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER3;
Một lược đồ XML có vùng tên, tham khảo một lược đồ XML khác có vùng tên
Khi một lược đồ XML có vùng tên tham khảo lược đồ XML khác có một vùng tên khác, phần tử
import được sử dụng với vùng tên và vị trí lược đồ được nhập khẩu Đối với vị trí lược đồ, nếu
bộ xử lý không sử dụng nó, bạn có thể bỏ qua nó DB2 không tham khảo vị trí lược đồ, mà sử dụng vùng tên để nhận được lược đồ XML Vì vậy, bạn có thể bỏ qua vị trí lược đồ này
customer4.xsd trong Liệt kê 5 là một lược đồ XML có vùng tên
http://www.sample.com/customer, và tham khảo một lược đồ XML khác có vùng tên
http://www.sample.com/company (trong Liệt kê 6) Có thể bỏ qua thuộc tính schemaLocation
của phần import trong customer4.xsd
Liệt kê 5 customer4.xsd (lược đồ XML)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/customer"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:com="http://www.sample.com/company"
elementFormDefault="qualified">
<xs:import namespace="http://www.sample.com/company"
schemaLocation="company4.xsd"/>
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element ref="com:name"/>
<xs:element ref="com:address"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema>
Liệt kê 6 company4.xsd (lược đồ XML)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/company"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
Trang 7<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:schema>
SAMPLE.CUSTOMER4 là ID quan hệ để lưu trữ cả hai lược đồ XML được giả định này, và customer4.xsd là vị trí lược đồ được giả định
Bước đầu tiên là ban hành lệnh sau để đăng ký lược đồ XML đầu tiên, customer4.xsd:
REGISTER XMLSCHEMA 'customer4.xsd' FROM '/work/customer4.xsd' AS
SAMPLE.CUSTOMER4;
Bước tiếp theo là thêm lược đồ XML company4.xsd Khi thêm nó, chỉ rõ vị trí lược đồ được sử dụng để quản lý lược đồ XML bên trong của Kho lưu trữ Lược đồ XML Khi bạn nhập khẩu một lược đồ XML có vùng tên khác nhau, thì vùng tên đó được dùng để nhận được lược đồ XML này Vì vậy, có thể sử dụng bất kỳ vị trí lược đồ nào vì vị trí lược đồ này không được sử dụng Trong ví dụ này, không bỏ qua thuộc tính schemaLocation của phần tử import, nhưng sử dụng tên tương tự cho vị trí lược đồ khi bạn thêm lược đồ XML Bằng cách làm này, bạn biết lược đồ XML đã nhập khẩu được lưu trữ ở đâu từ schemaLocation trong phần tử import
ADD XMLSCHEMA DOCUMENT TO SAMPLE.CUSTOMER4 ADD 'company4.xsd' FROM
'/work/company4.xsd';
Cuối cùng, ban hành lệnh sau để xác nhận hợp lệ lược đồ XML và kích hoạt nó:
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER4;
Về đầu trang
Chèn và xác nhận hợp lệ dữ liệu XML
Khi sử dụng các ví dụ, phần này giải thích cách xác nhận hợp lệ dữ liệu XML bằng cách sử dụng các lược đồ XML trong phần Đăng ký lược đồ XML, và chèn dữ liệu XML vào trong một cột XMLDATA Đầu tiên, tạo bảng T1:
CREATE TABLE T1 (ID INT NOT NULL PRIMARY KEY, XMLDATA XML NOT NULL);
Khi bạn xác nhận hợp lệ dữ liệu XML bằng câu lệnh SQL, hãy sử dụng hàm XMLVALIDATE Khi bạn xác nhận hợp lệ dữ liệu XML bằng lệnh IMPORT, hãy sử dụng tùy chọn
XMLVALIDATE
Một lược đồ XML không có vùng tên
Trang 8customer1.xml trong Liệt kê 7 là một ví dụ dữ liệu XML phù hợp với lược đồ XML
customer1.xsd Khi bạn tham khảo một lược đồ XML không có vùng tên, hãy sử dụng thuộc tính noNamespaceSchemaLocation của vùng tên "http://www.w3.org/2001/XMLSchema-instance"
Liệt kê 7 customer1.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer1.xsd"
type="1">
<name>cust1</name>
<address>address1</address>
<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer>
Hàm XMLVALIDATE có một vài tùy chọn Khi bỏ qua các tùy chọn như trong ví dụ câu lệnh INSERT sau đây, lược đồ XML có vị trí lược đồ của nó giống như vị trí lược đồ quy định trong
dữ liệu XML (trong ví dụ trong Liệt kê 7, giá trị của thuộc tính
xsi:noNamespaceSchemaLocation customer1 xsd) được sử dụng để xác nhận hợp lệ dữ liệu XML
INSERT INTO T1(ID, XMLDATA) VALUES (1,
XMLVALIDATE(XMLPARSE(DOCUMENT
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer1.xsd"
type="1">
<name>cust1</name>
<address>address1</address>
<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer>'))
);
Khi bạn thêm ID quan hệ ACCORDING TO XMLSCHEMA ID (ID quan hệ Theo XMLSCHEMA ID), hãy bỏ qua vị trí lược đồ được quy định trong dữ liệu XML, và sử dụng lược đồ XML có ID quan hệ của nó giống như ID quan hệ này để xác nhận hợp lệ dữ liệu XML
Dữ liệu XML ở trên phù hợp với SAMPLE.CUSTOMER1 Chỉ ban hành câu lệnh SQL sau đây
để xác nhận hợp lệ dữ liệu XML với lược đồ XML SAMPLE.CUSTOMER2
INSERT INTO T1(ID, XMLDATA) VALUES (11,
XMLVALIDATE(XMLPARSE(DOCUMENT
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer1.xsd"
type="1">
<name>cust1</name>
<address>address1</address>
Trang 9<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer>') ACCORDING TO XMLSCHEMA ID SAMPLE.CUSTOMER2)
);
Vì dữ liệu XML này phù hợp với SAMPLE.CUSTOMER1, nhưng không phù hợp với
SAMPLE.CUSTOMER2, nên xảy ra lỗi sau:
SQL16205N XML document contains too few elements to match content model
"((name,address,phone,email,company-name),company-address)" SQLSTATE=2200M
Như ví dụ này cho thấy, nhờ sử dụng ID quan hệ, bạn có thể xác nhận hợp lệ dữ liệu XML với các lược đồ XML mà không cần sửa đổi các dữ liệu XML
Lệnh IMPORT có một số tùy chọn XMLVALIDATE Việc chỉ rõ XML VALIDATE USING SCHEMALOCATION HINTS (XML xác nhận hợp lệ bằng cách sử dụng các gợi ý về vị trí lược đồ)
sử dụng vị trí lược đồ trong dữ liệu XML, trong khi việc chỉ rõ XMLVALIDATE USING SCHEMA Relational ID (XML xác nhận hợp lệ bằng cách sử dụng ID quan lệ của lược đồ) sử dụng ID quan hệ
Tạo tệp customer1.del sau để nhập khẩu một bản ghi trong bảng T1, có 111 trong cột ID, và có nội dung của tệp customer1.xml trong cột XMLDATA
Liết kê 8 customer1.del
111, "<XDS FIL='customer1.xml'/>"
Ban hành lệnh IMPORT sau để xác nhận hợp lệ dữ liệu XML với lược đồ XML thu được bằng
vị trí lược đồ trong dữ liệu XML:
Liệt kê 9 Xác nhận hợp lệ dữ liệu XML trong một lược đồ XML thu được bằng vị trí lược đồ
IMPORT FROM /work/customer1.del of del XML FROM /work
XMLVALIDATE USING SCHEMALOCATION HINTS INSERT INTO T1;
Xóa bản ghi nhập khẩu ở trên bằng cách ban hành câu lệnh SQL "DELETE FROM T1 WHERE
ID = 111", và ban hành lệnh IMPORT sau để xác nhận hợp lệ dữ liệu XML với lược đồ XML thu được bằng ID quan hệ trong dữ liệu XML:
Liệt kê 10 Xác nhận hợp lệ dữ liệu XML trong một lược đồ XML thu được bằng ID quan
hệ
Trang 10IMPORT FROM /work/customer1.del of del XML FROM /work
XMLVALIDATE USING SCHEMA SAMPLE.CUSTOMER1 INSERT INTO T1;
Một lược đồ XML không có vùng tên, tham khảo một lược đồ XML khác không có vùng tên customer2.xml trong Liệt kê 11 là dữ liệu XML mẫu phù hợp với customer2.xsd
Bạn có thể xác nhận hợp lệ dữ liệu XML theo cách tương tự như trong các Liệt kê 9 và 10
Liệt kê 11 customer2.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer2.xsd"
type="2">
<name>cust2</name>
<address>address2</address>
<phone>11-2222-3333</phone>
<email>cust2@sample.com</email>
<company-name>company1</company-name>
<company-address>company-address1</company-address>
</customer>
Một lược đồ XML có một vùng tên
customer3.xml trong Liệt kê 12 là dữ liệu XML mẫu phù hợp với customer3.xsd Khi tham khảo một lược đồ XML có một vùng tên, hãy chỉ rõ vùng tên và vị trí của lược đồ trong thuộc tính schemaLocation của vùng tên http://www.w3.org/2001/XMLSchema-instance
Bạn có thể xác nhận hợp lệ dữ liệu XML theo cách tương tự như trong các Liệt kê 9 và 10
Liệt kê 12 customer3.xml
<?xml version="1.0"?>
<customer xmlns="http://www.sample.com/customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sample.com/customer customer3.xsd"
type="3">
<name>cust3</name>
<address>address3</address>
<phone>11-2222-3333</phone>
<email>cust3@sample.com</email>
</customer>
Một lược đồ XML có vùng tên, tham khảo một lược đồ XML khác có một vùng tên khác