Tải bản đầy đủ (.pdf) (102 trang)

Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 3: Thao tác dữ liệu XML pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (365.88 KB, 102 trang )

Chuẩn bị cho kỳ thi 733 về Phát triển ứng dụng DB2 9, Phần 3: Thao tác dữ
liệu XML
Lưu trữ và lấy ra dữ liệu XML thông qua ứng dụng của bạn
Donald E. Payne, Chuyên gia tư vấn IT, IBM
Tóm tắt: Tìm hiểu DB2® của IBM® phân tích cú pháp XML, xử lý khoảng
trống và tuần tự hóa XML như thế nào và xem xét cách mã hóa tài liệu và kiểu dữ
liệu phía khách ảnh hưởng đến việc phân tích cú pháp và tuần tự hóa ra sao. Cũng
tìm hiểu cách DB2 xác nhận hợp lệ tài liệu XML dựa vào một lược đồ XML như
thế nào cũng như làm thế nào để sử dụng các hàm SQL/XML để "băm nhỏ" XML
thành dữ liệu quan hệ, lắp ráp ngược lại dữ liệu quan hệ thành XML và xuất bản
dữ liệu XML như là dữ liệu quan hệ.
Trước khi bạn bắt đầu
Về loạt hướng dẫn này
Chứng chỉ Nhà phát triển ứng dụng được IBM công nhận xác nhận với những
người khác rằng bạn là một nhà phát triển ứng dụng mức trung cấp hoặc cao cấp
về IBM DB2® dành cho Linux®, UNIX® và Windows® và chỉ ra rằng bạn có
các kỹ năng giỏi trong tất cả các nhiệm vụ lập trình chung cũng như lập trình SQL
nhúng, lập trình ODBC/CLI, lập trình .NET hoặc lập trình Java ™.
Loạt bài viết gồm chín hướng dẫn miễn phí này được thiết kế để trợ giúp cho bạn
chuẩn bị cho kỳ thi lấy chứng chỉ Nhà phát triển ứng dụng DB2 9 dành cho Linux,
UNIX và Windows (kỳ thi 733). Mỗi hướng dẫn bao gồm một liên kết đến một
bản tải về dùng thử miễn phí DB2 9 cho Linux, UNIX và Windows. Các hướng
dẫn này cung cấp một cơ sở chắc chắn cho mỗi phần của kỳ thi. Tuy nhiên, bạn
không nên chỉ dựa vào các hướng dẫn này như là sự chuẩn bị duy nhất cho kỳ thi
của bạn.


Hướng dẫn này nói về cái gì?
Hướng dẫn này dạy cho bạn về cách DB2 và ứng dụng khách DB2 thao tác dữ liệu
XML như thế nào. Bạn sẽ tìm hiểu:
 DB2 xử lý khoảng trống ở đầu vào như thế nào.


 DB2 xác định bảng mã của một tài liệu XML ở đầu vào và đầu ra như thế
nào.
 DB2 có thể xác nhận tính hợp lệ XML ở đầu vào như thế nào.
 Làm thế nào để thi hành một truy vấn XQuery hay XPath và nhận biết các
kết quả của nó.
 Làm thế nào để phân rã hoặc băm nhỏ, đầu vào XML thành các hàng trong
bảng quan hệ.
 Làm thế nào để xuất bản các dữ liệu quan hệ dưới dạng XML.
 Làm thế nào để xuất bản các dữ liệu XML như là các dữ liệu quan hệ.
Đây là bài thứ ba trong một loạt bài viết gồm chín hướng dẫn được thiết kế để
giúp bạn chuẩn bị cho kỳ thi lấy chứng chỉ Nhà phát triển ứng dụng DB2 9 (kỳ thi
733). Tài liệu hướng dẫn này trình bày các mục tiêu trong Phần 3 của kỳ thi, mang
tên "Thao tác dữ liệu XML".


Các mục tiêu
Sau khi hoàn thành hướng dẫn này, bạn sẽ có khả năng viết các ứng dụng để lưu
trữ và lấy ra dữ liệu XML.


Các điều kiện cần trước
Hướng dẫn này được viết cho các nhà phát triển DB2, những người đã quen thuộc
với các khái niệm sau:
 XML, bao gồm:
o Các phần tử.
o Các thuộc tính.
o Các tài liệu.
o Các tài liệu đúng ngữ pháp và cú pháp.
o Các khai báo XML.
o Các vùng tên.

 XPath, bao gồm mô hình dữ liệu XML (XDM - XML Data Model):
o Các nút.
o Các giá trị nguyên tử.
o Các mục.
o Các chuỗi.
o Trục: Cha mẹ, con cái, cháu chắt và v.v.
o Các bước.
o Các ký tự đại diện.
o Các vị từ
 XQuery:
o Các hàm db2-fn xmlcolumn(), sqlquery().
o Biểu thức FLWOR: for, let, where, order by, return.
o Đoạn mào đầu.
 Lược đồ XML, xác nhận hợp lệ và các vùng tên.
 Các khái niệm về mã hóa ký tự và mã Unicode.
Đối với các ví dụ mã, bạn cần quen với
 Ngôn ngữ lập trình.
 Bất cứ giao diện hay các thư viện nào được sử dụng, ví dụ như CLI và
JDBC.
 Các kiểu dữ liệu mà ngôn ngữ lập trình đó hỗ trợ và chúng ánh xạ tương
ứng tới các kiểu.
Xem phần Tài nguyên để tìm các đường liên kết đến những thông tin này.


Các yêu cầu hệ thống
Để hoàn thành hướng dẫn này, bạn cần những điều sau đây:
 Một máy tính chạy Linux, UNIX hoặc Windows, đã cài đặt FixPack 1 DB2
9.
 Một trình soạn thảo, ví dụ như Rational Application Developer (Nhà phát
triển ứng dụng Rational), Windows Notepad hoặc vi (xem Tài nguyên về hướng

dẫn này để biết thêm thông tin).
 Một trình biên dịch để chạy các ví dụ mã. Trang Trung tâm thông tin DB2
về các ngôn ngữ lập trình và các trình biên dịch được hỗ trợ để phát triển ứng dụng
cơ sở dữ liệu liên kết tới các trang liệt kê các trình biên dịch được hỗ trợ trong tất
cả các ngôn ngữ được hỗ trợ:
o Các trình biên dịch C được hỗ trợ: Xem phần Tài nguyên, mục
"Nhận sản phẩm và các công nghệ".
o Đối với ngôn ngữ Java, DB2 trên Windows đi kèm với một SDK
Java 2, phiên bản 5, bao gồm trình biên dịch javac và môi trường thời gian chạy
(JRE), dưới thư mục SQLLIB\java\jdk. (Trên hầu hết các nền tảng, DB2 9 hỗ trợ
Java 2 SDK, phiên bản 1.4.2 đến 5. Xem thông tin trực tuyến DB2, "Supported
Java application development software," để biết thêm chi tiết). Các JDK bao gồm
JRE trong thư mục SQLLIB\java\jdk\jre. Biến môi trường PATH của bạn cần phải
bao gồm các thư mục bin trong thư mục jdk; CLASSPATH cần phải bao gồm một
số các tệp tin JAR và ZIP dưới thư mục SQLLIB\java.
 Cần một trình duyệt Web để tiện xem một tệp tin XML, kiểm tra xem nó có
đúng khuôn dạng không và tìm ra các lỗi.


Chạy các ví dụ
Nếu bạn chạy các ví dụ SQL từ hướng dẫn này trong trình xử lý dòng lệnh (CLP)
DB2 db2, hãy xem phần có tên "DB2 Command Line Processor (CLP) behavior
and options".
Xử lý khoảng trống trong việc phân tích cú pháp và xác nhận hợp lệ XML
XML thay đổi theo việc phân tích cú pháp (đầu vào)
Khi DB2 hoặc một trình xử lý XML khác phân tích cú pháp XML đầu vào có
nghĩa là, chuyển đổi nó từ các ký tự thành một cấu trúc nội tại nó tạo ra một số
thay đổi với XML trong quá trình xử lý, như tiêu chuẩn XML đã định rõ. Một số
thay đổi này là quan trọng nếu bạn quan tâm đến các yêu cầu lưu trữ hoặc các yêu
cầu về bộ nhớ của XML trong DB2 hoặc trong ứng dụng khách. Nó cũng có thể

quan trọng nếu bạn quan tâm đến các nút văn bản chỉ chứa khoảng trống, vẻ ngoài
của XML khi lấy ra và tuần tự hóa trở lại thành các ký tự hoặc các chữ ký số.
Trình phân tích cú pháp (parser) xử lý đầu vào XML như sau:
1. Trình phân tích cú pháp sẽ xác định bảng mã. Nếu bảng mã của mã nguồn
không tương đương với bảng mã bên trong DB2 là UTF-8, thì các ký tự mã nguồn
được chuyển mã, hoặc được chuyển đổi từ bảng mã nguồn thành bảng mã của
DB2. Xem phần "Mã hóa XML", mục "Bảng mã nào?" để biết thêm thông tin.
2. Các ký tự hết dòng là carriage return (CR, hex code 0xD) và sang dòng line
feed (LF, hex code 0xA). Các hệ điều hành khác nhau (DOS/Windows,
UNIX/Linux, Mac OS hay OS X) tuân theo các quy ước khác nhau để kết thúc các
dòng. Các ký tự này được tiêu chuẩn hóa, hay là chuyển đổi thành chỉ một dạng,
LF hoặc 0xA.
3. Trình phân tích cú pháp kiểm tra một tài liệu đúng ngữ pháp và cú pháp.
4. Các thực thể XML bao gồm các thực thể đã định nghĩa sẵn như & và
" và các thực thể được định nghĩa trong một DTD. Các tham chiếu thực thể
trong tài liệu được khai triển hoặc được chuyển đổi thành giá trị của thực thể. (Các
mã ký tự đã khai triển của các thực thể đã định nghĩa sẵn là nhỏ hơn thực thể hay
tham chiếu ban đầu). Bất kỳ DTD nội tại nào sẽ được loại bỏ.
5. Khoảng trống là một thuật ngữ tóm bắt mọi (catch-all) ký tự không được in
ra, thường là:
o dấu cách (mã hex là 0x20).
o dấu tab (mã hex 0x9).
o Các ký tự hết dòng (như nói trên).
Khoảng trống ranh giới có thể được loại bỏ dựa trên các quy tắc mà bạn sẽ đọc
trong phần "Phân tích cú pháp và khoảng trống ranh giới" dưới đây.
6. Các tham chiếu ký tự XML chẳng hạn như € (€, biểu tượng đồng
euro) được khai triển hoặc chuyển đổi thành mã ký tự thực tế trong UTF-8. Giống
như với các tham chiếu thực thể đã định nghĩa sẵn, các mã ký tự đã khai triển
thường nhỏ hơn các tham chiếu ban đầu.
7. Khi xác nhận hợp lệ, khoảng trống có thể bỏ qua sẽ được loại bỏ. Xem

phần "Xác nhận hợp lệ và khoảng trống có thể bỏ qua" dưới đây để biết thêm
thông tin.
Các chú thích XML (<! comment >) không được loại bỏ.
Xem phần Tải về để tìm các mã mẫu giải thích việc phân tích cú pháp và xác nhận
hợp lệ thay đổi khoảng trống như thế nào.
Lời khuyên: Các tùy chọn -n và -q của CLP DB2 có thể ảnh hưởng đến khoảng
trống trong chuỗi ký tự bằng chữ trước khi chúng đi tới DB2. Xem phần "DB2
Command Line Processor (CLP) behavior and options" (Hành vi và các tùy chọn
của trình xử lý dòng lệnh DB2) để biết thêm thông tin.


Phân tích cú pháp và khoảng trống ranh giới
Khi bạn tạo ra XML, nó thường bao gồm thêm khoảng trống ranh giới để làm cho
nó "đẹp" và dễ đọc hơn. Khoảng trống ranh giới trong một tài liệu XML là văn
bản chỉ chứa các khoảng trống tại ranh giới giữa hai thẻ XML, mà không có ký tự
không phải khoảng trống nào khác.

Liệt kê1. Tài liệu XML mẫu với việc xử lý khoảng trống

<customerinfo xmlns="" Cid=' 1018 ' >
<name> </name>
<addr country=" Canada
ca " xml:space="preserve">
<street> </street>
<city> </city>
<prov-state> </prov-state>
<pcode-zip> </pcode-zip>
</addr>
<phone type=" "> 416-555-1358 </phone>
</customerinfo>


Trong liệt kê 1, có khoảng trống ranh giới giữa mỗi thẻ và thẻ tiếp theo. Ví dụ, có
khoảng trống:
 Giữa thẻ bắt đầu <customerinfo Cid=' 1018 '> và thẻ bắt đầu <name>
 Giữa thẻ bắt đầu </name> và thẻ kết thúc </name>
 Giữa thẻ kết thúc </phone> và thẻ kết thúc </customerinfo>
Nếu việc phân tích cú pháp không bỏ đi khoảng trống này, một tài liệu "đẹp" đã
phân tích xong sẽ có nhiều phần tử có nội dung hỗn hợp một sự hỗn hợp của các
phần tử con và các nút văn bản và nhiều nút văn bản không có gì khác ngoài
những khoảng trống.
Một giá trị thuộc tính không phải là khoảng trống ranh giới, thậm chí nếu tất cả nó
chỉ là các khoảng trống, như được gõ vào. Trong Liệt kê 1, khoảng trống xung
quanh con số 1018, các từ "Canada ca" và số điện thoại "516-555-1358" có thể là
các dữ liệu không đúng dạng, nhưng nó không phải là khoảng trống ranh giới.
Dưới đây là các quy tắc để loại bỏ hoặc giữ lại khoảng trống ranh giới, theo thứ tự
ưu tiên giảm dần:
1. Nếu XML chứa một phần tử với thuộc tính xml:space="preserve", thì trình
phân tích cú pháp sẽ giữ lại các khoảng trống ranh giới trong phần tử đó và mọi
phần tử con.
2. Nếu bạn chèn XML với một hàm tường minh XMLPARSE() và chỉ rõ hoặc
tùy chọn PRESERVE WHITESPACE hoặc tùy chọn STRIP WHITESPACE, thì
trình phân tích cú pháp sẽ giữ lại hoặc loại bỏ khoảng trống ranh giới như được chỉ
thị.
3. Nếu bạn chèn XML với hàm tường minh XMLPARSE() và không chỉ rõ
hoặc tùy chọn PRESERVE WHITESPACE hoặc tùy chọn STRIP WHITESPACE,
thì khoảng trống ranh giới sẽ bị loại bỏ, vì đó là mặc định cho hàm XMLPARSE()
4. Việc phân tích cú pháp sẽ ngầm xảy ra khi bạn chèn XML như là một chuỗi
ký tự bằng chữ, biến chủ hoặc cái đánh dấu tham số (parameter marker) mà không
có hàm XMLPARSE() hoặc XMLVALIDATE(). (XMLVALIDATE() thực hiện
việc phân tích cú pháp để xác nhận hợp lệ, là tường minh thực sự và bỏ qua quy

tắc này). Trong việc phân tích cú pháp ngầm ẩn trong một ứng dụng CLI:
o Bạn có thể dùng lệnh SET CURRENT IMPLICIT XMLPARSE
OPTION = 'value' trong phiên làm việc của bạn, ở đây value sẽ nhận giá trị hoặc là
PRESERVE WHITESPACE hoặc STRIP WHITESPACE. Nếu bạn làm thế, thì
trình phân tích cú pháp sẽ giữ lại hay loại bỏ khoảng trống ranh giới tuân theo chỉ
thị.
o Nếu không, khi bạn sửa đổi tệp tin db2cli.ini của bạn để bao gồm
thêm dòng.
CurrentImplicitXMLParseOption="parse-option"
o
vào trong một [section] được đặt tên theo tên cơ sở dữ liệu của bạn ([database-
name]), thì trình phân tích cú pháp sẽ giữ lại hay loại bỏ khoảng trống ranh giới
cho cơ sở dữ liệu này tuân theo chỉ thị. Tham số parse-option sẽ hoặc là
PRESERVE WHITESPACE hoặc STRIP WHITESPACE. Ví dụ:
[sample]
CurrentImplicitXMLParseOption="PRESERVE WHITESPACE"
o
Tệp tin db2cli.ini nằm trong %DBPATH%. Tên của section, tên của tham số và
giá trị của nó không phân biệt chữ hoa, chữ thường. Bạn có thể thêm mục này
hoặc bằng cách soạn thảo trực tiếp tệp tin, hoặc bằng câu lệnh DB2:
UPDATE CLI CONFIGURATION FOR SECTION section-name
USING CurrentImplicitXMLParseOption '"parse-option"';
o
5. Trình phân tích cú pháp loại bỏ khoảng trống ranh giới.

Liệt kê 2. Ví dụ về Quy tắc 5: Chèn XML với phần tử rỗng, phân tích cú pháp
ngầm ẩn, loại bỏ khoảng trống

connect to sample
insert into catalog values ('emptyelement', '<a> </a>')

DB20000I The SQL command completed successfully.

select catlog from catalog where name = 'emptyelement'
<a/>


Liệt kê 3. Ví dụ về Quy tắc 2: Chèn XML với phần tử rỗng, phân tích cú pháp
tường minh, giữ lại khoảng trống ranh giới

insert into catalog values ('preservespace', xmlparse(document '<a> </a>'
preserve whitespace))
DB20000I The SQL command completed successfully.

xquery db2-fn:sqlquery('select catlog from catalog where
name = ''preservespace'' ')/a
<a> </a>



Xác nhận hợp lệ và khoảng trống có thể bỏ qua
Khi bạn nhập vào XML bằng hàm XMLVALIDATE(), DB2 phân tích cú pháp tài
liệu, sau đó xác nhận tính hợp lệ tài liệu đã phân tích dựa vào một Định nghĩa
Lược đồ XML (XSD - XML Schema Definition). (Trong một số trường hợp, DB2
có thể phân tích cú pháp và xác nhận tính hợp lệ chỉ trong một bước với một trình
phân tích cú pháp xác nhận hợp lệ thay cho trình phân tích cú pháp mặc định
không xác nhận hợp lệ. Nhưng việc xử lý được mô tả trong "Phân tích cú pháp và
khoảng trống ranh giới" vẫn xảy ra trước tiên). Việc xác nhận hợp lệ luôn luôn loại
bỏ khoảng trống có thể bỏ đi được, đó là khoảng trống đáp ứng một trong các tiêu
chuẩn sau đây:
 Một kiểu phức hợp chỉ gồm phần tử là một phần tử được định nghĩa trong

XSD chỉ có các phần tử con và không có các nút văn bản nào. Khoảng trống giữa
các phần tử con trong một kiểu phức hợp chỉ gồm các phần tử là có thể bỏ đi được.
Loại khoảng trống có thể bỏ đi được này cũng là khoảng trống ranh giới, nó có thể
làm cho lẫn lộn hành vi thể hiện khi phân tích cú pháp và xác nhận hợp lệ.
 Nếu một phần tử đơn giản (chỉ có chứa một nút văn bản) hoặc một thuộc
tính được định nghĩa trong XSD như là một kiểu không phải chuỗi ký tự (ví dụ
như xs:integer, thì khoảng trống trong phần tử này hoặc giá trị thuộc tính đó có thể
bỏ qua được.
Nếu việc xác nhận hợp lệ đã không bỏ qua khoảng trống này, một tài liệu "đẹp" sẽ
gặp thất bại khi xác nhận hợp lệ vì nó có chứa các nút văn bản ở nơi không được
phép và chứa các ký tự không phải là số trong các giá trị số. Khoảng trống là một
phần của một nút văn bản đã định nghĩa trong một phần tử hoặc là một phần của
giá trị của một thuộc tính có kiểu xs:string là không thể loại bỏ được và không bị
loại bỏ.
Ví dụ, hãy xem Liệt kê 1 ở trên. Theo XSD, các kiểu chuỗi ký tự duy nhất là:
 Các nút văn bản trong các phần tử name (tên), street (đường phố), city
(thành phố), prov-state (tỉnh-bang), pcode-zip (mã bưu điện) và phone (điện
thoại).
 Các thuộc tính country (quốc gia) và type (kiểu).
Có khoảng trống có thể loại bỏ được ở các vị trí sau:
 Giữa một thẻ bắt đầu và một thẻ bắt đầu liền ngay sau đó ví dụ, giữa
<customerinfo Cid=' 1000 '> và <name>
 Giữa một thẻ kết thúc và một thẻ bắt đầu liền ngay sau đó ví dụ, giữa
</name> và <addr >
 Giữa một thẻ kết thúc và một thẻ kết thúc liền ngay sau đó ví dụ, giữa
</phone> và </customerinfo>)
 XSD định nghĩa thuộc tính Cid là một số nguyên:
<xs:attribute name="Cid" type="xs:integer" />

 Vì vậy khoảng trống xung quanh "1000" là có thể loại bỏ được và sẽ được

loại bỏ.
Khoảng trống trong các phần tử name, street, city, prov-state, pcode-zip và phone
không thể loại bỏ được.
Các lời khuyên:
 Một số các kịch bản lệnh mẫu mà bạn có thể tìm thấy tại
SQLLIB\samples\xml\db2sample_xml.db2 trong bản cài đặt DB2 của bạn chèn
XML như thế này:
XMLVALIDATE( XMLPARSE ( DOCUMENT ' ' PRESERVE WHITESPACE
) )

 Ví dụ:
INSERT INTO CUSTOMER ( Cid, Info ) VALUES (
1000,XMLVALIDATE( XMLPARSE ( DOCUMENT
'<customerinfo xmlns="" Cid=''1000''> '
PRESERVE WHITESPACE ) )

 Hàm XMLPARSE() giữ lại khoảng trống ranh giới; nhưng
XMLVALIDATE() loại bỏ khoảng trống có thể loại bỏ được.
 CLP DB2 có thể loại bỏ khoảng trống trong chuỗi ký tự bằng chữ, bao gồm
XML, trước khi gửi đến DB2. Xem một phần trong hướng dẫn này có tên "DB2
Command Line Processor (CLP) behavior and options" để biết thêm thông tin.
 CLP DB2 không phải là một ứng dụng CLI, do đó các tùy chọn CLI không
áp dụng cho nó.


Sự tuần tự hóa XML
XML thay đổi tại đầu ra
Khi DB2 tuần tự hóa XML, hoặc chuyển đổi nó từ cấu trúc nội tại trở lại thành
các ký tự, như khi phân tích cú pháp, chuẩn XML chỉ rõ một số các thay đổi đối
với dữ liệu, do đó nó có thể trông khác với những gì ở đầu vào. Mục đích và hiệu

quả của những sự thay đổi này là để tạo ra một chuỗi ký tự là tài liệu XML hợp lệ,
mà sau đó có thể được phân tích lại.
 Nếu bảng mã đích không hoàn toàn giống như bảng mã bên trong DB2 là
UTF-8, thì các ký tự UTF-8 được chuyển mã theo dạng đích. Các ký tự là các
tham chiếu ký tự tại đầu vào vẫn giữ nguyên là ký tự thực tế tại đầu ra, chúng
không phải mã hóa lại như một tham chiếu. Các ký tự không có trong bộ ký tự
đích sẽ bị mất, được thay thế bằng một ký tự như "?". Xem một phần trong hướng
dẫn này mang tên "XML encoding" để biết thêm thông tin.
 Một khai báo XML được tạo ra nếu bất kỳ điều nào sau đây là đúng:
o Bạn thực hiện tuần tự hóa tường minh với XMLSERIALIZE(XML-
expression INCLUDING XMLDECLARATION).
o Ứng dụng khách là một ứng dụng CLI hoặc ứng dụng SQL nhúng
(ESQL).
o Ứng dụng khách là một ứng dụng Java hoặc ứng dụng .NET, sử
dụng trình điều khiển DB2 cho JDBC và SQLJ, trình này lấy ra XML thành một
đối tượng DB2Xml sử dụng lớp com.ibm.db2.jcc.DB2Xml.
 Một mã đánh dấu trình tự byte (BOM) được tạo ra nếu bảng mã đích là
UTF-16.
 Các ký hiệu và (&), nhỏ hơn (<) và lớn hơn (>) được thay thế bằng các thực
thể XML của chúng (tương ứng là (&amp;, &lt; và &gt;).
 Trong các thuộc tính, hai dấu nháy kép (") được thay thế bằng thực thể
XML của chúng (&quot;).
 Trong các giá trị thuộc tính, các ký tự khoảng trống nhất định chẳng hạn
như CR, LF, và tab còn chưa được tiêu chuẩn hóa với XML ở đầu vào được
thay thế bằng tham chiếu số của chúng, &#n;, ở đây n là mã hex.
 Bởi vì các DTD nội tại được bỏ đi khi nhập đầu vào, các ký tự đã được khai
triển từ một thực thể được định nghĩa trong một DTD không được mã hóa trở lại
như là một tham chiếu thực thể, mà giữ nguyên dạng đã khai triển của chúng.
 Một phần tử rỗng là một phần tử không có nội dung có nghĩa là, không
có văn bản hoặc các nút nào giữa các thẻ bắt đầu và kết thúc. Khi được tuần tự hóa

ở đầu ra, nó sẽ xuất hiện chỉ như là một thẻ phần tử rỗng, <tag-name/>.
Lời khuyên: tùy chọn -i của CLP DB2 "in đẹp" kết quả đầu ra của một XQuery,
bằng cách thêm các dấu ngắt dòng và thụt dầu dòng. Tùy chọn -d tạo ra một khai
báo XML ở phần đầu của tài liệu. Xem một phần trong hướng dẫn này mang tên
"DB2 Command Line Processor (CLP) behavior and options" để biết thêm thông
tin.


Mã hóa XML
Bảng mã ký tự
Trước đây, các thuật ngữ bộ ký tự, mã hóa ký tự (character set, character
encoding) và trang mã (code page) tất cả đều có một ý nghĩa tương tự như nhau:
một bộ các ký tự và một bộ các mã nhị phân, ở đó mỗi mã biểu diễn cho một ký
tự. (Trang mã là một thuật ngữ của IBM dành cho một bộ ký tự dùng trên một
máy tính lớn hoặc máy tính cá nhân IBM PC). Các tên chính thức của các bộ ký tự
được duy trì bởi IANA (Internet Assigned Numbers Authority - một cơ quan thẩm
quyền trông coi việc cấp phát địa chỉ IP, tên miền mức đỉnh và điểm mã giao thức
Internet); xem phần Tài nguyên để biết thêm thông tin.
Các bảng mã ký tự di sản thừa kế
Một số các bộ ký tự di sản thừa kế phổ biến trong thế giới phương Tây là US-
ASCII, EBCDIC, trang mã 437, trang mã 1252, 8859-1, 1208, và Latin-1. Tất cả
chúng mã hoá một ký tự là một byte.
 Trang mã 437: Trong Microsoft Windows ở Hoa Kỳ, trang mã mặc định là
437; tên bảng mã chính thức IANA là ibm-437. Nó có một số ký tự không phải là
tiếng Anh (ví dụ, chữ ghép dính "ae", các nguyên âm chữ thường có dấu trọng âm,
một số các chữ cái Hy Lạp, các dấu ngoặc kép Pháp ("<<" và ">>") và 48 ký tự
cho đồ họa để tô bóng và tạo các hộp (một di sản thừa kế từ hệ điều hành DOS và
các chương trình dựa trên ký tự).
 Trang mã 1252: DB2 có hai mục trong nhóm trình đơn Start của nó dưới
các công cụ dòng lệnh (Command Line Tools:) Bộ xử lý dòng lệnh (Command

Line Processor) và cửa số lệnh (Command Window). Cả hai bắt đầu bằng cách
chạy một chương trình db2clpcp.exe, nó thay đổi trang mã từ trang 437 mặc định
(một lần nữa, tại Hoa Kỳ) thành trang 1252. Trang mã 1252, mà Microsoft cũng
gọi là "La-tinh-1", có chữ ghép dính "ae", các ký tự chữ hoa và chữ thường có dấu
trọng âm và biểu tượng euro (mã hex 0x80), nhưng không có các chữ Hy Lạp.
 Trang mã 1208: Khi bạn dùng lệnh CREATE DATABASE USING
CODESET UTF-8 (Tạo cơ sở dữ liệu sử dụng bộ mã UTF-8), trang mã cơ sở dữ
liệu tương ứng là 1208:
db2 get db cfg for sample | grep "code"
Database code page = 1208
Database code set = UTF-8
Database country/region code = 1

 Bộ ký tự iso-8859-1: Bộ ký tự này, cũng được gọi là Latin-1, là phổ biến
trong các trang Web tiếng Anh hoặc Tây Âu. Nó có chữ ghép dính "ae", các chữ
cái Latinh chữ hoa và chữ thường có dấu trọng âm, không có chữ cái tiếng Hy Lạp
và không có ký hiệu euro.
Xem Tài nguyên với các đường các liên kết đến các định nghĩa của các bộ ký tự
này và các định nghĩa khác.


Unicode
Bất kỳ một bảng mã di sản kế thừa đơn lẻ nào đều có các hạn chế do nó chỉ có thể
biểu diễn văn bản trong một tập hợp nhỏ các ngôn ngữ. Việc quản lý nhiều bảng
mã là rất đau đầu vì nhiều lý do, không chỉ vì hầu hết các ứng dụng và cơ sở dữ
liệu đã được thiết kế để xử lý chỉ một bảng mã. Unicode đã được phát minh để giải
quyết vấn đề này. Nó là một bộ ký tự đơn lẻ, biểu diễn được tất cả các ký tự trong
hầu như tất cả các ngôn ngữ đang sử dụng, và có dành chỗ để phát triển thêm
Với mã Unicode, ý tưởng đơn giản về một bộ ký tự đã được tinh lọc thành bốn
khái niệm:

 Một kho ký tự chỉ đơn thuần là một bộ tất cả các ký tự có thể được mã hóa,
nó không chỉ rõ bảng mã.
 Một bộ ký tự được mã hóa một bộ các số nguyên duy nhất để biểu diễn một
số hoặc tất cả các ký tự trong một kho ký tự, một số (hoặc điểm mã (code point))
dành cho một ký tự. Nó còn được gọi là bộ ký tự (character set, charset), hoặc bộ
mã (code set). Nó đồng nghĩa với trang mã (code page). Các điểm mã Unicode
nằm trong dải 0 đến 0x10FFFF (khoảng 1,1 triệu mã).
 Ban đầu, mã Unicode đã định nghĩa một kho ít hơn 64.000 ký tự, nên nó có
thể định rõ một bộ ký tự được mã hóa với các điểm mã 16-bit (2-byte). Với việc
bổ sung thêm nhiều các bảng chữ cái, kho ký tự đã vượt quá 64.000. Một vấn đề
khác là có nhiều hệ thống máy tính (đặc biệt là các chương trình được viết bằng
ngôn ngữ C) xử lý US-ASCII hoặc những hệ thống khác sử dụng một byte null
hoặc byte số không (\0 trong C) để đánh dấu sự kết thúc của một chuỗi ký tự. Thế
nhưng việc mã hóa các điểm mã Unicode trực tiếp thành 16-bit, hoặc nhiều bít hơn
sẽ bao gồm một số byte null, điều này có thể làm đổ vỡ các chương trình nói trên.
Do đó Unicode đã đưa vào một khái niệm mới character encoding form (CEF -
mẫu biểu mã ký tự), thường được viết tắt là character encoding (bảng mã ký tự)
hoặc chỉ đơn giản là encoding encoding (bảng mã). Một CEF là một ánh xạ từ các
điểm mã trong bộ ký tự được mã hóa tới một bộ các số nguyên khác nhau (hoặc
các đơn vị mã (code units)) trong đó các ký tự sẽ thực sự được mã hoá. Các đơn vị
mã là đơn vị nhỏ nhất được sử dụng để mã hóa các ký tự. Một ký tự duy nhất có
thể được biểu diễn bởi một hay nhiều đơn vị mã, cho phép nhiều ký tự hơn được
mã hóa.
Vì vậy các điểm mã chỉ để tham chiếu, do đó bạn có thể nói ký tự "đó" thực tế
trong chuỗi ký tự của Java, chuỗi ký tự char[] của C hoặc tệp tin có thể khác nhau,
tùy thuộc vào bảng mã ký tự của bạn. Một số bảng mã ký tự Unicode là UTF-8,
UTF-16 và UTF-32. Những con số 8, 16 và 32 biểu thị số bit trong đơn vị mã.
o UTF-8 (mà DB2 sử dụng) sử dụng từ 1 đến 4 đơn vị mã (byte, trong
trường hợp này) cho mỗi ký tự. Điều này rất quan trọng khi định kích cỡ các cột
[VAR]CHAR trong một cơ sở dữ liệu UTF-8: một ký tự có thể chiếm từ 1 đến 4

byte. Bảng mã ký tự UTF-8 không chứa bất kỳ byte null nào, rất thuận tiện cho
ngôn ngữ C.
o Trong bảng mã ký tự UTF-16 (mà ngôn ngữ Java sử dụng), các điểm
mã được sử dụng phổ biến nhất thấp hơn 64K và mã ký tự UTF-16 đơn giản là
bằng điểm mã. Điểm mã cao hơn đòi hỏi hai đơn vị mã.
o UTF-32 là bảng mã UTF có kích thước cố định duy nhất, nó làm đơn
giản hoá một số việc xử lý với chi phí không gian nhớ tăng lên. Đơn vị mã luôn
luôn bằng điểm mã.
Kể từ khi chuẩn Unicode hạn chế các điểm mã hợp pháp sao cho tất cả các bảng
mã UTF có thể biểu diễn bất kỳ điểm mã nào, việc chuyển đổi mã giữa các UTF
được đảm bảo không bị mất mát.
Các điểm mã Unicode thường được viết trong tài liệu dưới dạng U+hhhh , ở đây
hhhh đại diện cho 4 chữ số hexadecimal với điểm mã 2-byte; đối với các điểm mã
trên 64K, hãy sử dụng cú pháp này hai lần với 4 byte. Lưu ý rằng cú pháp này
được sử dụng trong tài liệu, nhưng XML và các ngôn ngữ lập trình có cú pháp
riêng của chúng để chỉ rõ chuỗi ký tự bằng chữ Unicode; xem phần mang tên
"Characters in code" (Ký tự trong mã lệnh) dưới đây để biết thêm thông tin.
 Một lược đồ mã hóa ký tự cho biết làm thế nào để sắp xếp thứ tự các byte
trong một đơn vị mã trong một luồng byte biểu diễn các ký tự. UTF-16 và UTF-32
cung cấp các cách để xác định thứ tự byte, đó là big-endian (mặc định), hoặc little-
endian. Đối với UTF-8, một đơn vị mã là 1 byte, do đó không có thứ tự nói cách
khác, việc sắp xếp thứ tự luôn luôn là như nhau bất kể thứ tự endian của máy tính.


Bảng mã nào?
Bất cứ điều gì có xử lý dữ liệu ký tự cần phải biết bộ ký tự, bảng mã ký tự và lược
đồ mã hóa ký tự của dữ liệu đó.
Bảng mã ngoài
Ngoài XML, văn bản chỉ có bảng mã ngoài. Bảng mã ngoài được định nghĩa bởi
trang mã hoặc địa phương (locale) trong môi trường; bởi ứng dụng; bởi kiểu biến;

hoặc một bảng mã được chỉ rõ trong một hàm hoặc phương thức (ví dụ như
phương thức String.getBytes(String encoding)).
Để xác định trang mã cơ sở dữ liệu trong đó một cơ sở dữ liệu đã được tạo ra, hãy
chạy:
db2 get db cfg for database-name


và kiểm tra giá trị của tham số Database code page (Trang mã cơ sở dữ liệu).
Trên Windows, một số khía cạnh của bảng mã phụ thuộc vào phiên bản đã cài đặt
của hệ điều hành. Chương trình máy khách (applet) "Các tùy chọn Vùng và Ngôn
ngữ" (Regional and Language Options) trong bàn điều khiển (Control Panel) cho
phép bạn thay đổi một số khía cạnh về địa phương (locale) và bàn phím của bạn.
Bạn có thể biết trang mã của bạn là gì bằng cách mở một cửa sổ lệnh và gõ lệnh
CHCP.
Trên Linux và UNIX, môi trường hoạt động được xác định từ các giá trị thiết lập
địa phương, trong đó bao gồm các thông tin về ngôn ngữ, lãnh thổ và bộ mã. Để
xác định trang mã đang hoạt động, hãy chạy:
locale

Bảng mã trong
Dữ liệu XML cũng có thể có bảng mã trong. Bảng mã trong là nội bộ ở bên trong
tài liệu XML. Có hai loại:
 Thuộc tính Encoding.
 Byte Order Mark (BOM-Mã đánh dấu thứ tự byte).
Thuộc tính Encoding cho khai báo XML, ở phía trên cùng của tài liệu, chỉ rõ một
tên bảng mã IANA chính thức:
<?xml version="1.0" encoding="UTF-8" ?>

Một BOM là một loạt các byte riêng biệt, ngay tại chỗ bắt đầu của tệp tin, chỉ báo
một bảng mã Unicode. Để đọc khai báo XML, một trình phân tích cú pháp XML

cần phải biết hoặc dự đoán bảng mã đó. Nhưng nó có thể đọc BOM một cách
chính xác.

Bảng 1. BOM dành cho bảng mã Unicode
Kiểu BOM Giá trị BOMBảng mã

UTF-8 X'EFBBBF' UTF-8
UTF-16 Big Endian X'FEFF' UTF-16
UTF-16 Little Endian

X'FFFE' UTF-16
UTF-32 Big Endian X'0000FEFF'

UTF-32
UTF-32 Little Endian

X'FFFE0000'

UTF-32

Bảng mã không nhất quán

×