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. Bi vi t ny tr狸nh by 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 vo 但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.
Bi vi t ny cung c p bi 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 no 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 ny:
<name>Jack Herrington</name>
Th( <name> ny 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 ny:
<powerUp />
C坦 th c坦 nhi u c叩ch h n m達 ho叩 m t i u g狸 坦 trong XML. V鱈 d , th( ny 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 vo m t th( XML. Th鱈 d , th( <name> ny 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 ny:
&
M t ti 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 ti 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
ngoi. 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 bi vi t ny, 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 ti li u XML c坦 th l HTML 炭ng ng ph叩p, kh担ng ph i t t c c叩c ti 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 ny 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 ny 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 Ti nguy棚n). T t c c叩c tr狸nh duy t hi n i tr v XHTML.
Ngoi 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 ti 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 Ti li u (DOM) c bi棚n
d%ch sang m t s) ci t c a PHP. Th vi n DOM c ton b ti li u XML sang b nh v tr狸nh by 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 vo )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 ny:
% 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 ci 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 no b ph但n t鱈ch c炭 ph叩p tr担ng th y m t v n b n no 坦, n坦 th c hi n c叩c cu c
g i l i n m t s) hm 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
hm g i l i. Trong th鱈 d ny, c叩c hm g i l i l startElement, endElement, v textData. Hm startElement
v endElement c g i ra khi c叩c th( c m v 坦ng t ng ng. Hm 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 ny, th( startElement t狸m ki m th( book kh i ng m t ph!n t m i trong m ng book. Sau 坦,
hm 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狸
hm 坦 a v n b n hi n t i vo 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 hm 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, hm 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 no 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 ny, 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 hm 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 no. N坦 kh i ng b ng c叩ch c t p vo m t chu*i l n. Sau 坦 n坦 s d ng m t
hm regex (hm 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坦. Ngoi 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 hm 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 vo 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 vo
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
vo m*i n炭t 坦. B c cu)i c湛ng cho m*i n炭t book l g#n n坦 l i vo 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 lm 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 ton b c叩c th( title, author, v publisher.
V n )i v i ti p c n ny 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, hm
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 hm 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 lm phi n n vi c vi t XML trong PHP c s . B n ngh& r ng b n ang t o XML hon h o, nh ng
sau 坦 b n nh n th y l m t s) ph!n t no 坦 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.
Ti 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 ti 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 ti 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 lm 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 vo 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 bi b叩o.