Một lược đồ đơn giản chỉ là một tập những luật được định nghĩa lại để mô tả nội dung dữ liệu của một tài liệu XML. Nó tương tự như một định nghĩa cấu trúc bảng trong cơ sở dữ liệu quan hệ. Trong lược đồ XML, chúng ta định nghĩa một tài liệu XML, những phần tử của nó, những kiểu dữ liệu của phần tử và những thuộc tính liên quan, và
điều quan trọng nhất là mối quan hệ “cha-con” giữa những phần tử. Chúng ta có thể tạo lược đồ trong nhiều cách khác nhau. Cách đơn giản nhất là sử dụng Notepad. Lựơc đồ
cho phép ta định nghĩa và khai báo kiểu dữ liệu mà ta cần. Ta dùng chỉ thị <schema> để
bắt đầu khai báo lược đồ. Sau đây là một ví dụ một lược đồ XML:
<xsd:schema id="Catalog" targetNamespace="http://tempuri.org/Catalog1.xsd" xmlns="http://tempuri.org/Catalog1.xsd” xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xsd:element name="Catalog" msdata:IsDataSet="true"msdata:EnforceConstraints="False">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded"> <xsd:element name="Product">
<xsd:complexType> <xsd:sequence>
<xsd:element name="ProductID" type="xsd:string" minOccurs="0" /> <xsd:element name="ProductName" type="xsd:string" minOccurs="0" /> <xsd:element name="ListPrice" type="xsd:string" minOccurs="0" /> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:choice> </xsd:complexType> </xsd:element> </xsd:schema> Kiểu Mô tả
bin.base64 Kiểu đối tượng nhị phân mã hóa theo chuẩn base64
bin.hex Kiểu hex
boolean Mang giá trị 0 hoặc 1. char Kiểu ký tự
date Ngày tháng
dateTime Ngày giờ float Số chấm động.
int Số nguyên.
number Kiểu sốđơn giản(không có giới hạn gồm số âm, số dương, số lẻ, số mũ…)
i1 Số nguyên 1 byte
i2 Số nguyên 2 byte
i4 Số nguyên 4 byte
r4 Số thực làm tròn đến 7 kí số.
r8 Số thực làm tròn đến 15 kí số.
ui2 Số nguyên không dấu 2 byte
ui4 Số nguyên không dấu 4 byte
Theo schema, phần tử chứa các phần tử con có thêm thuộc tính là complex type, nếu chỉ
chứa dữ liệu đơn giản như chuỗi, ngày tháng, số và không chứa thuộc tính và phần tử
con thì được gọi là simple type.
Khai báo các phần tử và kiểu dữ liệu:
<prefix:complexType> Tạo kiểu phức hợp <prefix:simpleType> Tạo kiểu đơn giản <prefix:element> Khai báo thành phần <prefix:attribute> Khai báo thuộc tính
Các kiểu giản đơn:
Kiểu Mô tả
binary Kiểu dữ liệu nhị phân như110001 boolean Kiểu luận lý nhưTrue, False, 1, 0 byte Kiểu byte như123; lớn nhất là 255 century Kiểu thế kỷ như20
date Kiểu ngày với định dạng YYYY-MM-DD như2001-10-15 decimal Kiểu thập như5.4, 0, -219.06
double Kiểu số thực 64-bit
ENTITIES Kiểu thực thể.
ENTITY Kiểu đa thực thể.
float Represents a single-precision 32-bit floating point
ID Kiểu định danh.
IDREF Kiểu tham chiếu định danh.
int Kiểu số nguyên như123456789 integer Kiểu số nguyên
language Kiểu định danh ngôn ngữ nhưde, fr, or en-US long Kiểu long integer, such as 12345678901234 month Kiểu tháng như2001-10
Name Represents the XML 1.0 Name type
NCName Holds an XML name without a namespace prefix and colon
negativeInteger Represents a negative integer
NMTOKEN Kiểu Token đơn.
NMTOKENS Kiểu đa token.
NOTATION Kiểu ghi chú.
short Kiểu short integer như12345 string Kiểu chuỗi
time Kiểu giờ như12:00:00.000
uriReference Holds a URI, such as http://www.w3c.org
year Kiểu năm 2001
- Ta có thể khai báo hay định nghĩa 1 kiểu phức hợp bên trong kiểu phức hợp mà ta đang định nghĩa. Ta có kiểu phức hợp address được sử dụng trong kiểu phức hợp transactionType.
- Trong chỉ thị khai báo phần tử ta có thể dùng tham chiếu (ref) đến phần tử đã
được định nghĩa ở nơi khác.
- Mặc dù được phép đưa vào 1 phần tử đã đựơc định nghĩa trứơc đó nhưng phải tuân theo quy tắc: phần tử không được là một phần của định nghĩa kiểu phức hợp, phần tử phải được khai báo tòan cục ngay sau cấp <schema>.
- Để chỉđịnh số lần xuất hiện của phần tử (có thể là số lần ít nhất) ta dùng thuộc tính minOccurs = 0, số lần nhiều nhất mà phần tửđựơc phép xuất hiện ta dùng thuộc tính maxOccurs.
- Chỉđịnh ràng buộc và trị mặc định cho thuộc tính:
Required Thuộc tính cần phải hiện hữu trong thẻ và phải đựơc gán trị. Optional Thụôc tính có thể có hoặc không và giá trị là không bắt buộc. Fixed giá trị thuộc tính phải được gán cốđịnh và không đựơc thay đổi. Default Nếu thuộc tính không được gán trị thì giá trịđịnh nghĩa trong lược
đồ là giá trị mặc định của thuộc tính. prohibited Không cho phép thụôc tính xuất hiện. Và ta dùng từ khóa “use” để chỉđịnh ràng buộc cho thuộc tính.
- Có thể tựđịnh nghĩa kiểu giản đơn nhưng phải dựa trên kiểu giản đơn cơ sở nội tại của đặc tả XML và ta dùng thuộc tính “base”.
- Khái niệm facet đựơc dùng để chỉ phạm vi giới hạn tập dữ liệu của kiểu giản
đơn, ta dùng 2 thành phần: minInclusive, maxInclusive.
Ngòai ra trong facet, còn thành “pattern” dùng để so khớp theo mẫu giới hạn và thành phần giới hạn kiểu liệt kê “enumeration”.
- Tạo các phần tử rỗng bằng cách khai báo kiểu phức hợp và đặt thuộc tính “content” là “empty”. Ví dụ:
<xsd:element name="image">
<xsd:complexType content="empty">
- Tạo các phần tử có nội dung hỗn hợp(vừa văn bản vừa các phần tử con) bằng cách khai báo kiểu phức hợp và đặt thuộc tính “content” là “mixed”.
- Lựơc đồ chú giải: <xsd:annotation>, <xsd:documentation>, và
<xsd:appInfo>. <prefix:annotation> Là phần tử chú giải chính chứa các phần tử con <prefix:documentation>, và <prefix:appInfo> <prefix:documentation> Dùng để chứa các chuỗi văn bản dùng để chứa chú thích trong tài liệu.
<prefix:appInfo> Chứa thông tin liên quan đến từng
ứng dụng.
- Tạo các lựa chọn: dùng khai báo <prefix:choice>.
- Tạo khai báo tuần tự: dùng định nghĩa <prefix:sequence>.
- Tạo nhóm và thuộc tính nhóm: dùng khai báo <prefix:group> - gom nhóm, <prefix: attributeGroup> - gom thuộc tính.
- Tạo nhóm all: các phần tửđựơc định nghĩa trong nhóm all phải xuất hiện đồng thời trong tài liệu hoặc không có phần tử nào xuất hiện cả.
Sơđồ thể hiện sự phân cấp giữa các kiểu dữ liệu.
2.5. Xpointer
Xpointer được dùng để trỏ đến một mục thông tin dữ liệu trong tài liệu XML. Xpointer được xây dựng dựa trên cơ sở Xpath. Tuy Xpath có khả năng định vị nhưng nó không có khả năng chỉ ra chính xác dữ liệu cần lấy. Để làm được điều này, chúng ta cần nhờ vào Xpointer. Để phân biệt sự khác nhau giữa Xpath và Xpointer, chúng ta hình dung để truy xuất dữ liệu chứa trong một tập tin văn bản nào đó, Xpath chỉ có thể tạo
đường dẫn đến vị trí của file, trong khi Xpointer có thể cho biết vị trí của từng ký tự cụ
thể hoặc một đoạn văn bản cụ thể.
Xpointer định nghĩa một vị trí dữ liệu dựa trên điểm trỏ (point). Có hai loại điểm đó là điểm trỏ nút (node-point) và điểm trỏ ký tự(chacracter-point). Khi muốn định vị tài liệu dựa trên các phần tử XML(nút), bạn sử dụng điểm trỏ nút. Khi muốn định vị dữ liệu
đến từng ký tự cụ thể của nội dunh tài liệu, bạn có thể dùng điểm trỏ ký tự. Các điểm trỏ
dựa trên chỉ số (index position) để xác định vị trí. Nếu tập dữ liệu bạn chỉđịnh bao gồm nhiều nút con thì chỉ số sẽ xác định vị trí điểm trỏ nút. Ngược lại nếu dữ liệu không chứa các phần tử thẻ XML thì chỉ số sẽ xác định điểm trỏ ký tự Vd: <DOCUMENT> <GREETING> Hello XML! </GREETING> </DOCUMENT>
Trong đoạn tài liệu trên có hai điểm trỏ nút. Điểm trỏ nút với chỉ số 0 chỉ phần tử gốc <DOCUMENT>, điểm trỏ nút với chỉ số 1 chỉ phần tử <GREETING>. Mặc dù vậy chúng ta có đến 10 điểm trỏ ký tự. Điểm trỏ ký tự với chỉ số 0 chỉ ký tự “H”, điểm trỏ
ký tự với chỉ số 9 chỉ ký tự “!”
Xpointer thường đựợc sử dụng chung với các địa chỉ cơ sở URI hay URL. Bạnsử dụng hàm trỏ xpointer() sau ký hiệu # của địa chỉ URL.
Vd:
Xlink
Xlink có nhiều kiểu liên kết khác nhau, đựợc chia thành 2 nhóm: -Simple link
-extended link: đích đến có thể là ngiều tài liều và liên kết có thểđịnh nghĩa một mối quan hệ giữa các tài liệu đó. Mối quan hệ cho phép liên kết hai chiều
Các thuộc tính của simple link
href đặc tả URI, URL hay vị trí của tài nguyên đích
inline đặc tả rằng nếu liên kết là inline (đích
đến là một phần trong tài nguyên cục bộ) hoặc out-of-line (đích đến không nằm trong tài nguyên cục bộ. Giá trị
true sẽ là inline, false sẽ là out-of-line Show chỉ định tài nguyên đích sẽ được biểu
diễn như thế nào. Có thể là
replace : tài nguyên đích sẽ được nạp vào cửa sổ hiện hành, hoặc thay hoặc thay thế dữ liệu hiện hành để xử lý embed : tài nguyên đích sẽ ược nhúng vào tài nguyên hay dữ liệu hiện hành new : tài nguyên đích sẽ được sẽ được nạp vào cửa sổ mới, không ảnh hưởng gì đến tới dữ liệu hiện hành
Actuate đặc tả rằng khi liên kết xoay chiều. Khi tài nguyên cái mà liên kết trỏ đến để được gọi hoặc truy cập.
user: tài nguyên đích chỉ được truy cập khi người dùng hoặc hành động bên ngoài yêu cầu
auto: tài nguyên đích được truy cập khi tài nguyên còn lại trong cung một liên kết được truy cập, để mở một series các tài nguyên có liên hệ với nhau bằng 1 cái click chuột
Behavior đặc tả một tập các chỉ dẫn không được
định nghĩa trong Xlink hay trong tài liệu XML nhưng chúng điều khiển trang thái của liên kết theo cách mà nộc dung
được biễu diễn. Tương tự như thuộc tính behavior trong CCS style sheet liên kết một phần tửđến một hàm
Role giống với thuộc tính name trong HTML, role được dùng để tạo mối liên kết giữa các tài liệu
Title đặc tả một cái nhãn hoặc một text được trình bày cho người dùng xem.
Content-role một cách thay thế cho role. Thông tin này sẽđược sử dụng mà không cần đặc
tả trong những chuẩn Xlink
Content-title một cách thay thế cho role. Thông tin này sẽđược sử dụng mà không cần đặc tả trong những chuẩn Xlink
Steps đặc tả “levels deep” để đi đến khi truy cập và những tài nguyên từ một liên kết. Ví dụ: nếu trang trang đích của liên kết
đặc tả các tài nguyên như là những đích
đến của các liên kết. Khi đó thuộc tình actuate sẽ là auto, ứng dụng có thể sẽ bị
quá tải khi truy cập vào tất cả các liên kết. Một giá trị nguyên cho steps sẽ
ngăn ngừa điều này bằng cách điều khiển những liên kết trong một mắt xích cho phép
Giái trị thuộc tính của xml:link dành cho extended link
để đặc tả liên kết mở rộng chúng ta phải có một cách để đặc tả một tập hợp các tài nguyên đích đến. Điều này được thực hiện bằng các sử dụng 2 giá trị đặc biệt dành riêng cho xml:link
“locator” đặc tả liên kết này chỉ đến một trong những tài nguyên. Nó nằm trong liên kết mở rộng
“group” ấn định rằng nó là một nhóm các liên kết đến các tài liệu và nó chứa một danh sách các liên kết này
“document” chỉ định rằng đây là liên kết đến tài nguyên. Nó nằm trong group
Vd1:
<mylink xml:link=”extended” inline=”false”>
<mytarget xml:link=”locator” inline=”false” role=”Font” Title=“How to specify different fonts”
Href=http://mysite.com/help/fonts.xml/>
<mytarget xml:link=”locator” inline=”false” role=“Color” Title=“How to specify different fonts”
Href=http://mysite.com/help/color.xml/>
<mytarget xml:link=”locator” inline=”false” role=”Text Size” Title=“How to specify different fonts”
Href=http://mysite.com/help/textsize.xml/> </mylink>
Vd2
<mylink xml:link=“group” inline =“false”>
<mytarget xml:link= “document” href= “http://mysite.com/doc/doc1.xml” /> <mytarget xml:link= “document” href= “http://mysite.com/doc/doc2.xml” /> <mytarget xml:link= “document” href= “http://mysite.com/doc/doc3.xml” /> </mylink>
Tạo điểm bắt đầu tuyệt đối trong tài liệu XML
root() đặc tả gốc của tài liệu, thường là phần tử gốc
origin() chỉ sử dụng khi vị trí đích nằm trong cùng tài liệu với liên kết. Đặc tả phần tử
chứa liên kết
Id(elementid) đặc tả phần tử có thuộc tính id là giá trị
elementid. Tất cả các giá trị của thuộc tính id phải là duy nhất trên tài liệu đích
đến
Html(anchorname) đặc tả HTML <A> anchor có thuộc tính name có giá trị anchorname. Tất cả các giá trị của Name trong tai liệu đích đến phải là duy nhất
Những kỹ thuật định vị trong tài liệu XML bắt đầu từ các điểm khởi đầu tuyệt đối Child những phần tử con trực tiếp của phần tử hiện hành.(only children) Descendant những phần tử tại cấp thấp của phần tử hiện hành(child,grandchild,…) Ancestor những phần tử tại cấp trên phần tử hiện hành(parent,grandparent) Psibling những phần tử cùng cấp nhưng xuất hiện trước phần tử hiện hành Fsibling những phần tử cùng cấp nhưng xuất hiện sau phần tử hiện hành Preceding những phần tử có thẻ mở hoặc thẻđóng xuất hiện trước phần tử hiện hành Following những phần tử có thẻ mở hoặc đóng xuất hiện sau phần tử hiện hành 2.6. Xpath
Trong tài liệu XML, bạn có thể dùng khái niệm đường dẫn tương tự hệ thống file của hệ điều hành thông qua khái niệm Xpath. Xpath cung cấp cho bạn cơ chế tham chiếu đến một mục dữ liệu trong tài liệu XML thông qua đường dẫn
Như chúng ta biết, tài liệu XML thường có phần tử gốc (root) ví dụ như <C></C> là phần tử gốc trong tài liệu minh họa ổđĩa nêu trên. Mọi phần tử con đều nằm bên trong phần tử gốc. Xpath định nghĩa phần tử gốc là ký tự sổ trái “/”. Để tham chiếu đến một nút dữ liệu trong tài liệu XML chúng ta có thể chỉđường dẫn tương tự nhưđường dẫn của thư mục.
Xpath và các tham chiếu đường dẫn trong tài liệu XML
Đường dẫn tuyệt đối
Nếu đường dẫn Xpath bắt đầu vàng / thì có nghĩa đây là một đường dẫn tuyệt đối bắt nguồn từ phần tử gốc
Vd:
/AAA Phần tửđược chọn là AAA
/AAA/BBB/CCC Chọn tất cả phần tử CCC con của /AAA/BBB
Đường dẫn tổng thể
Chúng ta sử dụng ký tự // để tham chiếu đến tất cả các phần tử trong tài liệu Vd //BBB chọn tất cả phần tử BBB trong tài liệu //BBB/DDD chọn tất cả các phần tử DDD con của BBB Chọn các phần tử bằng ký tựđại diện * Ký tựđại diện * dùng chọn tất cả các phần tử cùng thoả mãn đường dẫn chỉđịnh Vd /AAA/CCC/DDD/* chọn tất cả phần tử có đường dẫn /AAA/CCC/DDD /*/*/*/BBB chọn tất cả phần tử BBB nằm ở cấp thứ 3 //* chọn tất cả các phần tử trong tài liệu Chọn các phần tử theo vị trí bằng dấu ngoặc [] Chúng ta có thể dùng ngoặc vuông []để chỉđịnh vị trí của một phần tử XML cần chọn Vd
/AAA/BBB[1] chọn phần tử BBB đầu tiên trong nhánh /AAA
/AAA/BBB[last()] chọn phần tử BBB cuối cùng trong nhánh /AAA
chọn thuộc tính của một phần tử trong tài liệu
chúng ta có thể dùng ký hiệu @ để chọn hay chỉ đường dẫn đến thuộc tính bên trong phần tử XML
vd:
//@id chọn tất cả thuộc tính id trong tài liệu //BBB[@id] chọn tất cả phần tử BBB có thuộc tính
id
//BBB[*id] chọn tất cả phần tử BBB có khai báo thuộc tính
//BBB[not(@*)] chọn tất cả phần tử BBB không có khai báo thuộc tính
Chọn phần tử dựa trên nội dung thuộc tính
Chúng ta có thể dựa vào nội dung thuộc tính để xác định tiêu chuẩn lựa chọn các phần tử
Vd:
//BBB[@id=’b1’] chọn tất cả các phần tử BBB có thuộc tính id=’b1’(không phân biệt khoảng trắng)
//BBB[normalize-space(@name)=’bbb’] chọn tất cả các phần tử BBB có thuộc tính name=’bbb’(không phân biệt khoảng trắng)
Chọn phần tử trong tài liệu dựa trên sốđếm
Chúng ta có thể dùng hàm count()để xác định tiêu chuẩn lựa chọn dựa trên tổng số phần tử có mặt trong tài liệu Vd: //*[count(BBB)=2] chọn tất cả các phần tử có chứa 2 phần tử BBB //*[count(*)=2] chọn tất cả các phần tử có chứa 2 phần tử con Chọn phần tử dựa trên tên phần tử
Chúng ta có thể dựa trên tên của phần tửđể lọc ra các phần tử cần chọn trong tài liệu