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

Khám phá cả hai vị trí lược đồ và một ID quan hệ để quản lý các lược đồ XML và xác nhận hợp lệ dữ liệu XML

Lược đồ XML có nhiều kiểu khác nhau, bao gồm một lược đồ XML có và không có vùng tên, các lược đồ XML có nhiều định nghĩa, và các lược đồ XML có nhiều vùng tên. Bài viết này mang theo các loại lược đồ XML đó, và giới thiệu các cách để đăng ký các lược đồ XML, các cách để xác nhận hợp lệ dữ liệu XML, các cách để nhận được các lược đồ XML thường dùng để xác nhận hợp lệ dữ liệu XML và v.v.. Bài viết này được mô tả dựa trên DB2 9.7 cho Linux®, UNIX® và Windows®.

Masahiro Ohkawa, Phòng thí nghiệm phát triển phần mềm Yamato, IBM Japan

Masahiro Ohkawa là một thành viên của nhóm phát triển tạo công cụ cơ sở dữ liệu trong phòng thí nghiệm phát triển phần mềm Yamato (YSL), IBM Nhật Bản.



23 02 2010 (Xuất bản lần đầu tiên vào ngày 28 11 2011)

23.022010: Đã thêm các liên kết cho Phần 2 của loạt bài này trong các phần Giới thiệu, Kết luận, và Tài nguyên.

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)
Xác nhận hợp lệ một lược đồ XML bằng cách sử dụng vị trí lược đồ hoặc ID quan hệ (có thể nhập khẩu hay bao gồm lược đồ trong lược đồ khác)

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..

  • Lược đồ XML không có vùng tên
  • 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
  • Lược đồ XML có một vùng tên
  • 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

Đă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)
    1. 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"/>
                <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).

Hình 2. Vị trí lược đồ được sử dụng bên trong Kho lưu trữ Lược đồ XML
Vị trí lược đồ được biểu thị trong một lược đồ XML (có thể nhập khẩu hay bao gồm lược đồ trong lược đồ khác)

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.

REGISTER 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;

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.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">
    <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;

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

customer1.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>
    <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ệ
IMPORT 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ê 910.

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ê 910.

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

customer4.xml trong Liệt kê 13 là dữ liệu XML mẫu phù hợp với customer4.xsd. Trong ví dụ này, các vùng tên của tất cả các phần tử được quy định rõ. Khi bạn tham khảo nhiều lược đồ XML có nhiều vùng tên, hãy chỉ rõ nhiều cặp 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.

Khi bạn xác nhận hợp lệ dữ liệu XML bằng cách sử dụng vị trí lược đồ, DB2 thu được lược đồ XML bằng cách kiểm tra lần lượt vị trí lược đồ từ cặp đầu tiên. Trong ví dụ này, vùng tên http://www.sample.com/customer và vị trí lược đồ cusotmer4.xsd được chỉ rõ trong cặp đầu tiên. Lược đồ XML này nhập khẩu vùng tên http://www.sample.com/company nhận được lược đồ XML đã nhập khẩu. Trong cặp tiếp theo, vị trí lược đồ của vùng tên là thông tin http://www.sample.com/company, như lược đồ XML của nó đã thu được. Vì vậy, thông tin này bị bỏ qua. Cho nên giá trị của thuộc tính xsi:schemaLocation dưới đây là chỉ đủ để sử dụng cho cặp đầu tiên, http://www.sample.com/customercustomer4.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ê 910.

Liệt kê 13. customer4.xml
<?xml version="1.0"?>
<cust:customer xmlns:cust="http://www.sample.com/customer"
  xmlns:com="http://www.sample.com/company"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.sample.com/customer customer4.xsd
                      http://www.sample.com/company company4.xsd"
  type="4">
    <cust:name>cust4</cust:name>
    <cust:address>address4</cust:address>
    <cust:phone>11-2222-3333</cust:phone>
    <cust:email>cust4@sample.com</cust:email>
    <com:name>company4</com:name>
    <com:address>company-address4</com:address>
</cust:customer>

Tham khảo thông tin Kho lưu trữ Lược đồ XML và thông tin xác nhận hợp lệ dữ liệu XML

Ban hành câu lệnh SQL sau để nhận được ID đối tượng, ID quan hệ, vị trí lược đồ, và trạng thái của các lược đồ XML đã đăng ký.

SELECT OBJECTID,OBJECTSCHEMA,OBJECTNAME,SCHEMALOCATION,STATUS FROM SYSCAT.XSROBJECTS;

ID đối tượng trong bảng SYSCAT.XSROBJECTS được gán với một ID mới mỗi khi một lược đồ XML được đăng ký. Chữ 'C' trong cột trạng thái có nghĩa là hoàn thành, có sẵn để sử dụng.

Khi tất cả các lược đồ XML nói trên được đăng ký, bạn có thể nhận được các kết quả sau.

db2 => SELECT OBJECTID,
       SUBSTR(OBJECTSCHEMA,1,16) OBJECTSCHEMA,
       SUBSTR(OBJECTNAME,1,16) OBJECTNAME,
       SUBSTR(SCHEMALOCATION,1,16) SCHEMALOCATION,
       STATUS
   FROM SYSCAT.XSROBJECTS;
OBJECTID             OBJECTSCHEMA     OBJECTNAME       SCHEMALOCATION   STATUS
-------------------- ---------------- ---------------- ---------------- ------
    4785074604091136 SAMPLE           CUSTOMER1        customer1.xsd    C
    6755399441065728 SAMPLE           CUSTOMER2        customer2.xsd    C
    7881299347908352 SAMPLE           CUSTOMER3        customer3.xsd    C
    8725724278040320 SAMPLE           CUSTOMER4        customer4.xsd    C

Đối với một bảng có quan hệ, có bảng SYSCAT.XSROBJECTCOMPONENTS. Bảng này có một hoặc nhiều lược đồ XML kết hợp với một ID quan hệ. Mỗi lược đồ XML có vị trí lược đồ riêng của mình được sử dụng để quản lý các lược đồ XML bên trong Kho lưu trữ Lược đồ XML. Nó cũng có một ID đối tượng tương tự như một ID đối tượng trong bảng SYSCAT.XSROBJECTS.

Ban hành câu lệnh SQL sau để nhận được đối tượng ID, ID quan hệ, vị trí lược đồ được sử dụng bên trong Kho lưu trữ Lược đồ XML, và nội dung của lược đồ XML.

SELECT OBJECTID,OBJECTSCHEMA,OBJECTNAME,SCHEMALOCATION,
       XMLPARSE(DOCUMENT COMPONENT)
   FROM SYSCAT.XSROBJECTCOMPONENTS;

Do giới hạn chiều rộng trên trang này, ví dụ sau cho thấy tất cả các thông tin trên, trừ nội dung của lược đồ XML.

db2 => SELECT OBJECTID,
       SUBSTR(OBJECTSCHEMA,1,16) OBJECTSCHEMA,
       SUBSTR(OBJECTNAME,1,16) OBJECTNAME,
       SUBSTR(SCHEMALOCATION,1,16) SCHEMALOCATION
   FROM SYSCAT.XSROBJECTCOMPONENTS;

OBJECTID             OBJECTSCHEMA     OBJECTNAME       SCHEMALOCATION
-------------------- ---------------- ---------------- ----------------
    4785074604091136 SAMPLE           CUSTOMER1        customer1.xsd
    6755399441065728 SAMPLE           CUSTOMER2        customer2.xsd
    6755399441065728 SAMPLE           CUSTOMER2        company2.xsd
    7881299347908352 SAMPLE           CUSTOMER3        customer3.xsd
    8725724278040320 SAMPLE           CUSTOMER4        customer4.xsd
    8725724278040320 SAMPLE           CUSTOMER4        company4.xsd

Để nhận được đối tượng ID của lược đồ XML thường dùng để xác nhận hợp lệ dữ liệu XML, sử dụng hàm XMLXSROBJECTID. Khi sử dụng hàm này dựa vào dữ liệu XML chưa được xác nhận hợp lệ , giá trị 0 được trả về.

SELECT XMLXSROBJECTID(XMLDATA) FROM T1;

Để chỉ kiểm tra xem dữ liệu XML đã được xác nhận hợp lệ hay không, sử dụng biến vị ngữ IS VALIDATED (được xác nhận hợp lệ chưa). Để thêm các tùy chọn trong biến vị ngữ, bạn có thể nhận được dữ liệu XML được xác nhận hợp lệ với một lược đồ XML cụ thể.

SELECT * FROM T1 WHERE XMLDATA IS VALIDATED;

Nếu bạn muốn nhận được TRUE (Đúng) dựa vào dữ liệu XML được xác nhận hợp lệ và FALSE (Sai) dựa vào dữ liệu XML chưa được xác nhận hợp lệ , hãy ban hành câu lệnh SQL sau đây.

SELECT ID,CASE WHEN XMLDATA IS VALIDATED THEN 'TRUE' ELSE 'FALSE' END FROM T1;

Cập nhật và xác nhận hợp lệ dữ liệu XML

Khi cập nhật dữ liệu XML, ngay cả khi dữ liệu XML được cập nhật phù hợp với lược đồ XML, thì thông tin đã xác nhận hợp lệ trước đó lúc này vẫn chưa được xác nhận hợp lệ. Nếu bạn muốn thông tin xác nhận hợp lệ, bạn cần phải xác nhận lại tính hợp lệ dữ liệu XML bằng hàm XMLVALIDATE.

UPDATE T1
SET XMLDATA=XMLQUERY(
 'declare namespace cust="http://www.sample.com/customer";
  copy $new := $XMLDATA
  modify do replace value of $new/cust:customer/cust:address with "address4-2"
  return  $new')
WHERE ID = 4

Ví dụ sau đây cho thấy cách thêm một phần tử khi bạn cập nhật dữ liệu XML. Kết quả là, nó không phù hợp với lược đồ XML được xác nhận trước đây. Nhưng việc cập nhật thành công vì dữ liệu XML vẫn chưa được xác nhận hợp lệ.

UPDATE T1
SET XMLDATA=XMLQUERY(
 'declare namespace cust="http://www.sample.com/customer";
  copy $new := $XMLDATA
  modify do insert <cust:zip>1234567</cust:zip> into $new/cust:customer
  return  $new')
WHERE ID = 4

Để xác nhận hợp lệ dữ liệu XML, sử dụng hàm XMLVALIDATE như hiển thị dưới đây.

UPDATE T1
SET XMLDATA=XMLVALIDATE(XMLQUERY(
 'declare namespace cust="http://www.sample.com/customer";
  copy $new := $XMLDATA
  modify do insert <cust:zip>1234567</cust:zip> into $new/cust:customer
  return  $new'))
WHERE ID = 4

Trong ví dụ này, việc xác nhận hợp lệ không thành công. Kết quả là, dữ liệu XML không được cập nhật, và các lỗi sau đây xuất hiện.

SQL16196N  XML document contains an element "cust:zip" that is not correctly 
specified. Reason code = "37"  SQLSTATE=2200M

Kết luận

DB2 quản lý các lược đồ XML bằng vị trí lược đồ do W3C đề xuất, và bằng ID quan hệ do DB2 giới thiệu. W3C cho phép các bộ xử lý quyết định xem có sử dụng vị trí lược đồ không. Vì vậy, DB2 cung cấp hai cách để nhận được lược đồ XML. Một là sử dụng vị trí lược đồ, cách khác là bỏ qua vị trí lược đồ và sử dụng các ID quan hệ để thay thế. DB2 đảm bảo tính nhất quán của ID quan hệ, và cung cấp các tính năng để xác nhận hợp lệ dữ liệu XML với các lược đồ XML mà không làm thay đổi vị trí lược đồ được quy định trong dữ liệu XML.

Do DB2 cũng đưa ra một cách sử dụng vị trí lược đồ do W3C đề xuất, nên bạn có thể lựa chọn một cách theo sở thích của mình. Tuy nhiên, DB2 không đảm bảo tính nhất quán của vị trí lược đồ. Bạn cần quản lý nó khi bạn sử dụng vị trí lược đồ.

Theo cả hai cách, bạn có thể thấy liệu dữ liệu XML có được xác nhận hợp lệ hay không, và với lược đồ XML nào thì dữ liệu XML được xác nhận hợp lệ.

Khi bạn cập nhật dữ liệu XML, thông tin được xác nhận hợp lệ trước đó vẫn chưa được xác nhận hợp lệ. Bạn có thể xác nhận hợp lệ dữ liệu XML bằng hàm XMLVALIDATE khi bạn cũng cập nhật nó.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở, Information Management
ArticleID=776864
ArticleTitle=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
publish-date=02232010