http://www.ebook.edu.vn Căn bn v XML
Xpath (XML Path Language)
1 Gii thiu.
Trước khi đi vào phn này chúng ta hãy xem li mt ví d v tài liu XML:
<?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>
Vi ví d này khi chúng ta m vi trình duyt IE chúng ta s được kết qu
sau:
Như vy chúng ta thy trên trình duyt s hin th y nguyên tài liu gc. Vy
làm cách nào để chúng ta có th đi li trên các phn t ca tài liu XML để
trích ra nhng d liu mà chúng ta cn thiết.
Để đáp ng điu này người ta thiết kế ra mt ngôn ng XPath. XPath có mt
vai trò quan trng trong vic trao đổi d liu gia các máy tính hay gia các
chương trình ng dng vì nó cho chúng ta sàng lc các d liu mà ta mong
mun.
http://www.ebook.edu.vn Căn bn v XML
Order (Element gc)
OrderNo = “1047”
OrderDate (2002-03-26)
Custumer (John Costello)
Item
Product (Chair)
ProductID=”1”
UnitPrice=”70”
Quantity(6)
Item
Product (Desk)
ProductID=”2”
UnitPrice=”250”
Quantity(1)
Chú thích
Element
Thuc tính
XPath xem XML như mt cây, vi ví d trên s được biu din dưới dng cây
sau:
Hình 2.2
Bây gi chúng ta hãy hc cách đi qua các nút trong tài liu XML.
2 Cú pháp ca XPath
2.1 Đường dn tuyt đối
Nếu đường dn XPath bt đầu bi du / thì có nghĩa đây là mt đường dn
tuyt đối bt đầu t phn t gc.
Trong hình2.2 trên, bây gi chúng ta mun chn nút Order ta viết như sau
Cú pháp nguyên: /child::Order
Cú pháp tt: /Order
Đi ra nhánh con Custumer bng XPath như sau:
Cú pháp nguyên: /child::Order/child::Custumer
Cú pháp tt: /Order/Custumer
Trong trường hp mun đi đến thuc tính ca nút thì chúng ta cn phi ch
t khóa Attribute trong cú pháp nguyên hoc @ trong cú pháp tt.
Để ly thuc tính OrderNo ca nút Order ta dùng cú pháp XPath như sau:
Cú pháp nguyên: /child::Order/Attribute::OrderNo
http://www.ebook.edu.vn Căn bn v XML
Cú pháp tt: /Order/@OrderNo
2.2 Đường dn tương đối
Khi chúng ta mun trích mt phn t nào đó mà chúng ta ch biết tên ca
phn t này ch chúng ta không biết là phn t này nm v trí nào thì chúng
ta có th dùng đường dn tương đối để làm điu này. Chúng ta dùng du // để
ch cho trình phân tích biết đây là đường dn tương đối.
Ví d, để trích các phn t có tên là Product chúng ta viết như sau:
Cú pháp nguyên: //child::Product
Cú pháp viết tt: //Product
Khi chúng ta viết như thế này thì khi đi qua trình phân tích s truy tìm đến các
phn t có tên là Product
2.3 Chn các phn t bng ký t đại din
Để chn tt c các phn t con ca mt phn t nào đó chúng ta dùng ký t
đại din *.
Ví d, để ly tt c các phn t con ca phn t Order ta viết như sau:
Cú pháp nguyên: /child::Order/child::*
Cú pháp tt: /Order/*
2.4 Chn các phn t theo điu kin
Để ly các phn t theo mt điu kin nào đó chúng ta dùng du ngoc
vuông([ ]).
Ví d, để ly mi phn t Product có thuc tính UnitPrice > 70 ta viết như
sau:
Cú pháp nguyên:
//child::Product[Attribute::UnitPrice>70]
Cú pháp tt:
//Product[@UnitPrice>70]
Ví d, để ly nhng phn t Item có phn t con là Product và có thuc tính
ProductID=1 chúng ta viết như sau:
Cú pháp nguyên:
//child::Item[child::Product/Attribute::ProductID=1]
Cú pháp tt:
//Item[Product/@ProductID=1]
2.5 Mt s hàm thường dùng
Tên hàm Ý nghĩa Ví d
count() Hàm ly tng s nút con ca mt
phn nào đó
//Item[count(*)=2]
Chn tt c các phn t Item có s phn
http://www.ebook.edu.vn Căn bn v XML
t con là 2
name() Ly tên ca phn t /Order/*[name()=’Item’]
Chn tt c các phn t con ca Order
có tên là Item
not() Hàm ph định //Item/*[not(@*)]
Chn tt c các phn t con ca Item
không cha thuc tính nào
normalize-space(str) Hàm b khong trng //Item/*[normalize-
space(@ProductID)=’abc’]
Chn tt c các phn t con ca Item có
thuc tính ProductID=abc (không phân
bit khong trng)
starts-
with(str,substr)
Hàm kim tra xem chui str có
cha chui substr (tính t v trí đầu
tiên) hay không
//item/*[starts-with(name(),’P’)]
Chn tt c các phn t con ca Item có
tên bt đầu bi ký t P
contains(str,substr) Kim tra mt chui str có cha
chui con substr hay không
//item/*[contains(name(),’u’)]
Chn tt c các phn t con ca phn
t Item mà tên ca các phn t con này
có ch ký t u
string-length(str) Hàm ly chiu dài ca 1 chui //Item/*[string-length(name())=5]
Chn tt c các phn t con ca Item
đội tên ca các phn t con này
là 5
position() Cho biết v trí hin ti ca phn t //Item[position()=5]
Chn phn t Item có v trí là 5
floor() Ly giá tr nh nht gn vi giá tr
ch định
ceiling() Ly giá tr ln nht gn vi giá tr
ch định
last() V trí nút cui cùng //Item[last()]
Chn phn t Item cui cùng
2.6 Mt s toán t thường dùng
Tên toán t Chc năng Ví d
| Toán t hoc dùng để chn ra mt
ln nhiu phn tđiu kin khác
nhau
//Item/*[starts-with(name(),’U’) | starts-
with(name(),’Q’) ]
Chn tt c các phn t là con ca Item
có có tên bt đầu bi ký t P hoc Q
descendant Chn phn t con ca phn t ch
định
/Order /Item/Product/descendant::*
Chn tt c các phn t là con ca
/Order/Item/Product
ancestor Chn phn t cp trên /Order/Item/Product/ancestor::*
http://www.ebook.edu.vn Căn bn v XML
chn 2 phn t Item và phn t Order
following-sibling Chn phn t cùng cp kế tiếp /Order/OrderDate/following-sibling::*
chn các phn t Custumer và hai phn
t Item theo sau và cùng cp vi phn
t OrderDate
preceding-sibling Chn phn t cùng cp trước đó /Order/Custumer/preceding-sibling::*
chn phn t OrderDate
following Chn phn t theo sau phn t ch
định /Order/OrderDate/following::*
chn phn t Custumer và 2 phn t
Item và các phn t con ca Item
preceding Chn các phn t đứng trước phn
t ch định /Order/Custumer/preceding::*
chn tt c các phn t đi trước phn t
Custumer
descendant-or-self Chn phn t cp dưới và phn t
ch định /Order/Item/descendant-or-self::*
Chn tt c các phn t Item và các
phn t con ca phn t này
ancestor-or-self Chn phn t cp trên và phn t
ch định /Order/Item/product/ancestor-or-
self::*
chn 2 phân t product, 2 phn t Item
và phn t Order
3 Mt s ví d
Chn phn t gc AAA (/AAA)
<AAA>
<BBB/>
<CCC/>
<BBB/>
<BBB/>
<DDD>
<BBB/>
</DDD>
<CCC/>
</AAA>
Chn phn t CCC là con ca AAA (/AAA/CCC)
AAA
BBB
CCC
BBB
DDD BBB
CCC