Bài 2
Đi li trong XML bng XPATH (phn I)
Chúng ta đã thy cu trúc và cú pháp ca XML tương đối đơn giãn. XML cho ta mt
cách chun để trao đổi tin tc gia các computers. Bước tiếp theo là tìm hiu cách nào
mt chương trình chế biến (process) mt tài liu XML
Dĩ nhiên đ chế biến mt XML chương trình ng dng phi có cách đi li bên trong tài
liu để ly ra values ca các Elements hay Attributes. Do đó người ta thiết kế ra ngôn
ng XML Path language, mà ta gi tt là XPath. XPath đóng mt vai trò quan trng
trong công tác trao đổi d liu gia các computers hay gia các chương trình ng
dng vì nó cho phép ta la chn hay sàng lc ra nhng tin tc nào mình mun để trao
đổi hay hin th.
Nếu khi làm vic vi cơ s d liu ta dùng SQL statement Select .. from TableXYZ
WHERE ... để trích ra mt s records t mt table, thì khi làm vic vi XML, mt table
d liu nho nh, XPath cho ta nhng expressions v criteria (điu kin) ging ging
như clause WHERE trong SQL.
XPath là mt chun để process XML, cũng ging như SQL là mt chun đ làm vic
vi cơ s d liu. Tiên phuông trong vic trin khai các chương trình áp dng XPath là
công tác ca các công ty phn mm ln như Microsoft, Oracle, Sun, IBM, v.v. S dĩ ta
cn có mt chun XPath là vì nó được áp dng trong nhiu hoàn cnh, nên cn phi
có mt lý thuyết rõ ràng, chính xác.
Lý thuyết v XPath hơi khô khan nhưng nó được áp dng trong mi k thut ca gia
đình XML. Cho nên bn hãy kiên nhn nm vng nhng điu căn bn v nó để khi
nào gp ch người ta dùng XPath thì mình nhn din và hiu được. So vi võ thut, thì
XPath trong XML ging như Tn pháp và cách th. Tp luyn Tn pháp thì mõi chân,
tp th thì nhàm chán, nhưng không có hai th đó thì ra chiêu không có công lc,
chưa đánh đã thua ri.
Ta s ch hc nhng th thường dùng trong XPath thôi, nếu bn mun có đy đủ chi
tiết v XPath thì có th tham khão Specification ca nó
http://www.w3c.org/TR/xpath.
XML như mt cây đối vi XPath
XPath cho ta cú pháp để din t cách đi li trong XML. Ta coi mt tài liu XML như
được đại din bng mt tree (cây) có nhiu nodes. Mi Element hay Attribute là mt
node. Để minh ha ý nim ny, bn hãy quan sát tài liu đặt hàng (order) XML sau:
<?xml version="1.0"?>
<Order OrderNo="1047">
<OrderDate>2002-03-26</OrderDate>
<Customer>John Costello</Customer>
<Item>
<Product ProductID="1" UnitPrice="70">Chair</Product>
<Quantity>6</Quantity>
</Item>
<Item>
<Product ProductID="2" UnitPrice="250">Desk</Product>
<Quantity>1</Quantity>
</Item>
</Order>
Ta có th biu din XML trên bng mt Tree như dưới đây, trong đó node Element
màu nâu, node Attribute màu xanh:
Ch định Location Path
Bn có th dùng XPath expression để ch định Location Path (li đi đến v trí) đến
node nào hay trích ra (tr v) mt hay nhiu nodes tha đúng điu kin yêu cu.
XPath expression có th là tuyt đối, tc là ly node gc làm chun hay tương đối,
tc là khi đầu t node va mi được chn. Node y được gi là context node (node
vai chính trong tình hung).
Có hai cách viết để din t XPath Location, viết nguyên và viết tt. Trong c hai cách
ta đều dùng du slash (/) để nói đến Document Element, tc là node gc. Ta có th
đi li trong các node ca Tree ging ging như các node ca Windows System
Directory mà ta thy trong Panel bên trái ca Window Explorer. Ta cũng s dùng
nhng ký hiu như slash /, mt chm . và hai chm .. ca Windows System File Folder
cho cách viết tt trong XPath Location để đi xung các nodes con, cháu, ch định
context node, hay đi ngược lên các nodes t tiên.
Location Path tuyt đối
Chúng ta hãy tìm vài location paths trong cái Tree ca tài liu XML v đặt hàng nói
trên. Mun chn cái node ca Element Order (nó cũng là Root Element) bng cú pháp
nguyên, ta s dùng XPath expression sau đây:
/child::Order
Dch ra cú pháp tt, expression ny tr nên:
/Order
Đi ra nhánh ca Tree, ta s tìm được node Customer bng cách dùng XPath
expression sau:
/child::Order/child::Customer
Sau đây là XPath expression viết tt tương đương:
/Order/Customer
Nếu bn mun ly ra mt node Attribute, bn phi nói rõ điu ny bng cách dùng t
chìa khóa (keyword) attribute trong cách viết nguyên hay dùng character @ trong cú
pháp tt. Do đó để ly Attribute OrderNo ca Element Order, ta s dùng XPath
expression sau:
/child::Order/attribute::OrderNo
Cú pháp tt cho Attribute OrderNo là:
/Order/@OrderNo
Để trích ra các nodes con cháu, tc là các nodes nhánh xa hơn, ta dùng keyword
descendant trong cú pháp nguyên hay mt double slash (//) trong cú pháp tt. Thí d,
để ly ra các nodes Product trong tài liu, bn có th dùng expression location path
sau:
/child::Order/descendant::Product
Cú pháp tt tương đương là:
/Order//Product
Bn cũng có th dùng wildcards (lá bài Joker) để nói đến nhng nodes mà tên ca
chúng không thành vn đề. Thí d, du asterisk (*) wildcard ch định bt c node tên
nào. Location path sau đây chn tt c các nodes con ca Element Order:
/child::Order/child::*
Cú pháp tt tương đương là:
/Order/*
Location Path tương đối
Nhiu khi XPath location paths là tương đối vi context node, trong trường hp y
location path din t cách ly ra mt node hay mt s (set of) nodes tương đối vi
context node. Thí d như, nếu Element Item th nht trong order là context node, thì
location path tương đối đ trích ra Element con Quantity là:
child::Quantity
Trong cú pháp tt, location path tương đối là:
Quantity
Tương t như vy, để ly ra Attribute ProductID ca Element con Product, cái location
path tương đi là:
child::Product/attribute::ProductID
Expression y dch ra cú pháp tt là:
Product/@ProductID
Để đi ngược lên phía trên ca Tree, ta dùng keyword parent (cha). Dng tt tương
đương ca keyword ny là hai du chm (..). Thí d nếu context node là Element
OrderDate, thì Attribute OrderNo có th được ly ra t Element Order bng cách dùng
location path tương đối sau:
parent::Order/attribute::OrderNo
Để ý là cú pháp ny ch tr v mt tr s khi node cha tên Order. Nếu mun ly ra
Attribute OrderNo t node cha không cn biết nó tên gì bn phi dùng expression sau:
parent::*/attribute::OrderNo