1. c và vi t XML DOM v i PHP Page 1 of 8
c và vi t XML DOM v i PHP
!
M c : Trung bình
Jack Herrington, T ng biên t p, Code Generation Network
08 01 2010
Các k thu t myriad s n có c và vi t XML trong PHP. Bài vi t này trình bày ba ph ng th c c
XML: s d ng th vi n DOM, s d ng b phân tích cú pháp SAX, và s d ng các bi u th c chính quy.
Vi c vi t XML b ng cách s d ng DOM và khuôn m u v n b n PHP c ng s c c p.
Vi c c và vi t Ngôn ng ánh d u M r ng (XML) trong PHP hình nh h i áng ng i. Trong th c t , XML và t t
c các công ngh liên quan c a nó có th là n ng n . Tuy nhiên, c và vi t XML trong PHP không ph i là m t tác v
áng ng i. Tr c tiên, b n c!n ph i h c m t chút v XML -- nó là gì và s d ng vào âu. Sau ó, b n c!n ph i h c
cách c và vi t XML trong PHP, nh ng th mà b n có th th c hi n b ng nhi u cách.
Bài vi t này cung c p bài h c v" lòng ng#n trên XML r$i gi i thích cách c và vi t XML trong PHP.
XML là gì?
XML là m t %nh d ng l u tr d li u. Nó không %nh ngh&a d li u nào ang c ghi l i ho c c u trúc c a d li u
ó. XML ch' %nh ngh&a các th( và thu c tính cho các th( ó. M t th( XML có d ng úng trông gi)ng nh th này:
<name>Jack Herrington</name>
Th( <name> này ch a m t s) v n b n: Jack Herrington.
M t th( XML mà không ch a v n b n trông gi)ng nh th này:
<powerUp />
Có th có nhi u cách h n mã hoá m t i u gì ó trong XML. Ví d , th( này t o cùng m t !u ra nh th( tr c:
<powerUp></powerUp>
B n c ng có th b sung các thu c tính vào m t th( XML. Thí d , th( <name> này ch a các thu c tính u tiên và
cu i cùng:
<name first="Jack" last="Herrington" />
B n c ng có th mã hoá các ký t c bi t trong XML. Thí d , m t ký hi u ampersand (&) c mã hoá nh th này:
&
M t tài li u XML ch a các th( và thu c tính c %nh d ng nh các thí d ã cho là úng ng pháp, ngh&a là các th(
c cân )i, và các ký t c mã hoá úng cách. Li t kê 1 là m t thí d v XML úng ng pháp.
Li t kê 1. M t thí d v m c l c XML các sách
2. c và vi t XML DOM v i PHP Page 2 of 8
XML trong Li t kê 1 ch a m t danh m c c a các cu)n sách. Th( cha <books> (các sách) g$m m t t p h p các th(
<book> (sách), m*i th( ch a các th( <author> (tác gi ), <title> (tiêu ), và <publisher> (nhà xu t b n).
Các tài li u XML là h p l khi c u trúc c a các th( và n i dung c a chúng c xác th c b i m t t p l c $ bên
ngoài. T p l c $ có th c xác %nh trong m t lo t các %nh d ng. Nh m ph c v bài vi t này, t t c m i th b n
c!n là XML úng ng pháp.
N u b n ngh& r ng XML trong r t gi)ng Ngôn ng ánh d u Siêu v n b n (HTML) thì b n ã úng. C XML và
HTML là ngôn ng d a trên các th(, và chúng có nhi u s gi)ng nhau. Tuy nhiên, i u quan tr ng là ph i l u ý r ng
trong khi các tài li u XML có th là HTML úng ng pháp, không ph i t t c các tài li u XML là HTML úng ng
pháp. Th( ng#t (br) là m t ví d tuy t h o v nh ng s khác nhau gi a XML và HTML. Ng#t dòng này là HTML
úng ng pháp, nh ng XML không úng ng pháp:
<p>This is a paragraph<br>
With a line break</p>
Ng#t dòng này là XML và HTML úng ng pháp:
<p>This is a paragraph<br />
With a line break</p>
N u b n mu)n vi t HTML c ng là XML úng ng pháp, hãy theo chu+n Ngôn ng ánh d u Siêu v n b n M r ng
(XHTML) t, World Wide Web Consortium (W3C) (xem Tài nguyên). T t c các trình duy t hi n i tr v XHTML.
Ngoài ra, nó còn có th s d ng các công c XML c XHTML và tìm d li u trong các tài li u, d- h n nhi u so
v i vi c phân tích cú pháp thông qua HTML.
c XML b ng cách s d ng th vi n DOM
Cách d- nh t c m t t p XML úng ng pháp là s d ng th vi n Mô hình )i t ng Tài li u (DOM) c biên
d%ch sang m t s) cài t c a PHP. Th vi n DOM c toàn b tài li u XML sang b nh và trình bày nó nh m t cây
các nút, nh minh ho trong Hình 1.
Hình 1. Cây XML DOM dùng cho XML các sách
Nút books t i 'nh c a cây có hai th( book con. Trong m*i cu)n sách (book) , có các nút author, publisher, và
title. Các nút author, publisher, và title m*i th có các nút v n b n con ch a v n b n.
B mã c t p XML các sách và hi n th% n i dung s d ng DOM hi n th% trong Li t kê 2.
Li t kê 2. c XML các sách (books) v i DOM
! "! # $%&
' $ ()# %&
3. c và vi t XML DOM v i PHP Page 3 of 8
' * # + , - # $ . . %&
/ $ %
0
' * # + , - # $ . . %&
' #$1%' 2 &
' * # + , - # $ . . %&
' #$1%' 2 &
' * # + , - # $ . . %&
' #$1%' 2 &
. ' ' 3 .&
4
K%ch b n l nh kh i ng b ng cách t o m t )i t ng new DOMdocument và n p XML các sách vào )i t ng ó
thông qua s d ng ph ng th c load. Sau ó k%ch b n l nh s d ng ph ng th c getElementsByName nh n m t
danh m c t t c các ph!n t v i tên cho tr c.
Trong vòng l p c a các nút book, k%ch b n l nh s d ng ph ng th c getElementsByName nh n nodeValue cho
các th( author, publisher, và title. nodeValue là v n b n trong nút. Sau ó k%ch b n l nh hi n th% các giá tr% ó.
B n có th ch y k%ch b n l nh PHP trên dòng l nh nh th này:
% php e1.php
PHP Hacks - Jack Herrington - O'Reilly
Podcasting Hacks - Jack Herrington - O'Reilly
%
Nh b n th y, m t dòng c in ra cho m*i kh)i sách. ó là m t xu t phát t)t. Tuy nhiên, i u gì x y ra n u b n
không có quy n truy c p n th vi n XML DOM?
c XML thông qua s d ng b phân tích cú pháp SAX
M t cách khác c XML là s d ng API n gi n cho b phân tích cú pháp XML (SAX). H!u h t t t c các cài t
c a PHP có b phân tích cú pháp SAX. B phân tích cú pháp SAX ch y trên mô hình g i l i. M*i khi m t th( c
m ra ho c óng l i, ho c b t k. lúc nào b phân tích cú pháp trông th y m t v n b n nào ó, nó th c hi n các cu c
g i l i n m t s) hàm do ng /i dùng %nh ngh&a v i các thông tin nút ho c v n b n.
L i th c a m t b phân tích cú pháp SAX là ch* nó th c s nh0. B phân tích cú pháp không gi l i quá lâu b t k.
cái gì trong b nh , cho nên nó có th c dùng cho các t p c c l n. Nh c i m là ch* vi c vi t các cu c g i l i
b phân tích cú pháp SAX là m t i u quá phi n ph c. Li t kê 3 hi n th% b mã c t p XML các sách và hi n th%
n i dung thông qua s d ng SAX.
Li t kê 3. c XML các sách v i b phân tích cú pháp SAX
5 $%&
5 # &
/ * # $ 6 # 6 %
0
5 6 5 #&
/ $ # + 7 % 5 89 $%&
5 # # &
4
/ * # $ 6 # %
0
5 #&
5 # &
4
4. c và vi t XML DOM v i PHP Page 4 of 8
/ ) ! $ 6 ) %
0
5 6 5 #&
/ $ 5 # :;, <<
5 # ;+=>? * <<
5 # ,>,=* %
0
5 8 $ 5 % ' @ 98 5 # 9 ) &
4
4
)# 5 5 $%&
)# 5 5 # 5 $ 6 . * # .6 . * # . %&
)# 5 5 5 5 $ 6 . ) ! . %&
/ / $ ()# 6 %&
$ / $ /6 A1BC % %
0
)# 5 $ 6 %&
4
)# 5 5/ $ %&
/ $ 5 %
0
8 ,>,=* 9(. ' .( 8 :;, 9(. ' .&
8 ;+=>? * 9(.3 .&
4
K%ch b n l nh kh i ng b ng cách thi t l p m ng g_books, gi l i t t c các cu)n sách và thông tin c a chúng trong
b nh , và bi n g_elem, ghi l i tên c a th( mà k%ch b n l nh hi n ang x lý. Sau ó k%ch b n l nh %nh ngh&a các
hàm g i l i. Trong thí d này, các hàm g i l i là startElement, endElement, và textData. Hàm startElement
và endElement c g i ra khi các th( c m và óng t ng ng. Hàm textData c c g i trên v n b n
gi a kh i ng và k t thúc các th(.
Trong thí d này, th( startElement tìm ki m th( book kh i ng m t ph!n t m i trong m ng book. Sau ó,
hàm textData xem xét ph!n t hi n t i xem nó là m t th( publisher, title, ho c author. N u nh v y thì
hàm ó a v n b n hi n t i vào cu)n sách hi n t i.
vi c phân tích cú pháp c th c hi n, k%ch b n l nh t o b phân tích cú pháp v i hàm xml_parser_create.
Ti p theo, nó thi t t các b x lý g i l i. Sau ó k%ch b n l nh c trong t p và g i các m ng thông tin c a t p n
b phân tích cú pháp. Sau khi t p c c, hàm xml_parser_free xoá b1 b phân tích cú pháp. Ph!n cu)i c a k%ch
b n l nh xu t ra n i dung c a g_books.
Nh b n th y, ây là b mã cho phép vi t v ng chãi h n nhi u so v i d ng t ng ng DOM. N u b n không có th
vi n DOM ho c th vi n SAX thì sao? Có ph ng án nào khác không?
Phân tích cú pháp XML v i các bi u th c chính quy
Ch#c ch#n tôi b% m t s) k s chê vì c p ti p c n này, nh ng b n có th phân tích cú pháp XML b ng các bi u th c
chính quy. Li t kê 4 cho th y m t thí d c a vi c s d ng hàm preg_ c t p các sách.
Li t kê 4. c XML các sách v i các bi u th c chính quy
)# ..&
/ / $ ()# 6 %&
$ / $ /6 A1BC % % 0 )# ( & 4
/ $ / %&
5# 5 $ . 3 3 $(D %3 3 3 .6
)# 6 %&
/ $ 8@9 %
5. c và vi t XML DOM v i PHP Page 5 of 8
0
5# 5 $ . 3 3 $(D %3 3 3 .6
6 %&
5# 5 $ . 3 3 $(D %3 3 3 .6
6 %&
5# 5 $ . 3 3 $(D %3 3 3 .6
6 %&
$ 8@9819(. ' .( 8@9819(. ' .(
8@9819(.3 . %&
4
L u ý r ng b mã ó ng#n nh th nào. Nó kh i ng b ng cách c t p vào m t chu*i l n. Sau ó nó s d ng m t
hàm regex (hàm bi u th c chính quy) c trong m*i m c sách. Cu)i cùng, b ng cách s d ng vòng l p foreach,
k%ch b n l nh l p m*i kh)i sách và ch n ra tác gi , tiêu , và nhà xu t b n.
V y thì âu là nh c i m? V n )i v i vi c s d ng b mã bi u th c chính quy c XML là nó không ki m tra
tr c ch#c ch#n r ng XML úng ng pháp. Có ngh&a là b n không th bi t là b n có XML không úng ng pháp
tr c khi b n b#t !u c nó. Ngoài ra, m t s) d ng m u h p l c a các bi u th c chính quy không th phù h p v i
XML c a b n, do ó b n s ph i s a i chúng sau.
Tôi không bao gi/ khuyên s d ng các bi u th c chính quy c XML, nh ng ôi khi nó là cách thích h p nh t vì
các hàm bi u th c chính quy luôn s n có dùng. ,ng s d ng bi u th c chính quy c XML t, tr c ti p ng /i
dùng; b n không i u khi n khuôn d ng ho c c u trúc c a XML ó. Hãy luôn c XML t, ng /i dùng b ng cách s
d ng m t th vi n DOM ho c b phân tích cú pháp SAX.
Vi t XML b ng DOM
c XML ch' là m t ph!n c a ph ng trình. Vi t nó thì sao nh'? Cách t)t nh t vi t XML là s d ng DOM. Li t kê
5 hi n th% cách DOM xây d ng t p XML các sách.
Li t kê 5. Vi t XML các sách b ng DOM
$%&
89 $
6
6
. .
%&
89 $
6
6
. .
%&
! "! # $%&
' / # &
' * # $ . . %&
' E $ %&
/ $ %
0
' * # $ . . %&
' * # $ . . %&
' E $
' , ) - $ 8 9 %
%&
' E $ %&
' * # $ . . %&
' E $
' , ) - $ 8 9 %
%&
' E $ %&
' * # $ . . %&
' E $
6. c và vi t XML DOM v i PHP Page 6 of 8
' , ) - $ 8 9 %
%&
' E $ %&
' E $ %&
4
' F G"=$%&
T i ph!n trên !u c a k%ch b n l nh, m ng books c n p vào v i m t s) sách m u. Các d li u ó có th t, ng /i
dùng ho c t, m t c s d li u.
Sau khi các cu)n sách m u c n p, k%ch b n l nh t o m t new DOMDocument m i và b sung nút books g)c vào
nó. R$i k%ch b n l nh t o m t ph!n t cho tác gi , tiêu , và nhà xu t b n cho m*i cu)n sách và thêm m t nút v n b n
vào m*i nút ó. B c cu)i cùng cho m*i nút book là g#n nó l i vào nút books g)c.
o n cu)i c a k%ch b n l nh xu t XML ra b n i u khi n nh/ ph ng th c saveXML. ((B n c ng có th s d ng
ph ng th c save (ghi l i) t o m t t p t, XML.) !u ra c a k%ch b n l nh hi n th% trong Li t kê 6.
Li t kê 6. K t qu u ra t k ch b n l nh xây d ng DOM
H A(
)# F .@(1.
H
Giá tr% th c c a vi c s d ng DOM là nó t o XML luôn úng ng pháp. Nh ng b n có th làm gì n u b n không có
quy n truy c p DOM t o XML?
Vi t XML b ng PHP
N u không có s n DOM, b n có th s d ng khuôn m u v n b n PHP vi t XML. Li t kê 7 hi n th% cách PHP xây
d ng nên t p XML các sách.
Li t kê 7. Vi t XML các sách b ng PHP
$%&
89 $
6
6
. .
%&
89 $
6
6
. .
%&
/ $ %
0
7. c và vi t XML DOM v i PHP Page 7 of 8
$ 8 9 %&
$ 8 9 %&
$ 8 9 %&
4
Ph!n trên !u c a k%ch b n l nh t ng t nh k%ch b n l nh DOM. Ph!n cu)i c a k%ch b n l nh m ra th( books, sau
ó l p l i qua m*i cu)n, t o th( book và toàn b các th( title, author, và publisher.
V n )i v i ti p c n này là vi c mã hoá các th c th . ch#c ch#n r ng th c th c mã hoá úng cách, hàm
htmlentities ph i c g i trên m*i m c, nh trong Li t kê 8.
Li t kê 8. S d ng hàm htmlentities mã hoá các th c th
/ $ %
0
# $ 8 96 *-,5I; ,*? %&
# $ 8 96 *-,5I; ,*? %&
# $ 8 96 *-,5I; ,*? %&
$ %&
$ %&
$ %&
4
ây là lý do nó l i làm phi n n vi c vi t XML trong PHP c s . B n ngh& r ng b n ang t o XML hoàn h o, nh ng
sau ó b n nh n th y là m t s) ph!n t nào ó không c mã hoá úng cách khi c) g#ng ch y nó v i d li u th c.
K t lu n
Quanh XML luôn có nhi u c /ng i u và l n x n. Tuy nhiên, nó không khó kh n nh b n ngh& -- nh t là trong m t
ngôn ng l n nh PHP. Khi b n hi u và th c hi n XML úng cách, b n s th y có nhi u công c m nh mà b n có th
s d ng. XPath và XSLT là hai công c áng th nghi m.
Tài nguyên
H ct p
Tìm hi u v các tiêu chu+n dùng cho XHTML t i XHTML 1.0, Ngôn ng ánh d u Siêu v n b n M r ng.
Tìm các tiêu chu+n dùng cho XML.
Tìm hi u v ngôn ng / d n XML.
ng
Tìm hi u v các phép chuy n i XSL, m t ngôn ng dùng bi n i XML.
c tiêu chu+n dùng % ngh&a c u trúc c a các tài li u XML c a b n, L
nh c $ XML.
8. c và vi t XML DOM v i PHP Page 8 of 8
Tìm nhi u tài nguyên h n cho các nhà phát tri n XML trong vùng XML c a developerWorks.
Hãy th m developerWorks Open source zone có thông tin h ng d n cách làm sâu h n, công c , và các c p
nh t d án giúp b n phát tri n v i các công ngh mã ngu$n m và s d ng chúng v i các s n ph+m c a
IBM.
L y s n ph m và công ngh
Hãy th m PHP.net tìm hi u các tin t c m i nh t v PHP, tìm các t i v , và h c t p t, nh ng ng / dùng
i
khác.
Tìm hi u v b Phân tích cú pháp XML Expat, b phân tích mà c s d ng cung c p các ch c n ng b
phân tích cú pháp SAX dùng cho PHP.
i m i d án phát tri n mã ngu$n m ti p theo c a b n v i ph!n m m dùng th c a IBM, s n có t iv
ho c trên &a DVD.
Th o lu n
Tham gia c ng $ng developerWorks b ng cách gia nh p vào các blog c a developerWorks.
ôi nét v tác gi
Jack D. Herrington là k s ph!n m m cao c p v i h n 20 n m kinh nghi m. Ông là tác gi c a ba cu)n sách: Code
Generation in Action, Podcasting Hacks và PHP Hacks. Ông c ng ã vi t h n 30 bài báo.