用PHP与XML进行网站编程

上一篇 / 下一篇  2006-11-10 09:21:59

一、小序
QJ1U#qvD.c"{7_0
  PHPChina 开源社区门户uT*q q+KQ!]r}
  HTML简单易学又通用,一般的PHP程序就是嵌入在HTML语言之中实现的。但是随着WEB越来越广泛的应用,HTML的弱点也越来越明显了。XML的出现,弥补了这些不足,它提供了一个能够处理互联网上全部数据的通用方法。PHPChina 开源社区门户)|*O a c/~7dl
  
xS1nO[ U:g5D0  二、HTML的局限性分析
7{1},\9ds0  PHPChina 开源社区门户Z-M4h7AB+N0e
  1、 HTML的可扩展性差。虽然作为一般的应用,HTML应经够用了,但是在处理数学和化学等符号时,HTML有明显的缺点,而且它无法进行扩展,这样使它的发展收到了极大的限制。
uw'H4Hr;~0  PHPChina 开源社区门户J/PS[z,``[
  2、 链路丢失后不能自动纠正。由于Web页面的URL地址经常改变,而在改变URL地址时必须手工修改这些信息,否则就会遇到“404URL地址未找到”的信息,这大大加重了Web页面的维护工作量。PHPChina 开源社区门户j;MC|;H|qafwc
  
zN!FXcn V o0  3、 数据搜索的时间长。由于HTML主要用来对网页的显示进行控制,导致了同一个数据在不同的网页中有不同的存储格式,这样在进行数据搜索时就无法快速找到所需的资料。
*Lr?!A1oF;y+q0  
{UA'E6P lZ#m6d0  4、 HTML对双字节或者多国文字的支持不够。例如中文信息页面在不同的平台下会出现无法显示等问题。
vT(gs;S3{"q0  PHPChina 开源社区门户U+S4?XP
  正是由于这些缺点,人们研究了能够代替HTML的Web页面制作语言。其中已经投入使用的有:可扩展标记语言XML、层叠样式表(CSS)以及动态HTML(DHTML)等。PHPChina 开源社区门户\-n)RUl$IN
  PHPChina 开源社区门户&x@E3cw w.{ n?
  三、XML的组成
k9c'lo:bV"Bu0  PHPChina 开源社区门户@@[9J}r u
  这里简要列举几种主要的XML技术:
;VEy"ar8g Z%Q k*g0  PHPChina 开源社区门户Y|vp5v#Kf
  1、 DTD(文档类型声明)PHPChina 开源社区门户|PQ*c| }nI$D
  
.H V*fb5R+o~0  DTD的主要功能是定义XML的内容模式;限制XML标记的数据范围;定义属性的数据类型。但由于它不是用XML编写的,因此扩展性比较差;而且只提供了有限的几种数据类型,因此它的作用是有限的。
V0] ?,eX0  
;b zv\L{k0  2、 XML Schema
N qC)a(}0  PHPChina 开源社区门户.X-hb6k5Ya@
  XML Schema的作用和DTD类似。但不同的是,Schema文件所描述的是引用它的XML文件中的元素和属性的具体类型。另外,由于它是由XML编写的,Schema和DTD相比较还有以下优点:
IW2Cu bb4F0  PHPChina 开源社区门户M#P~u*h5_YQo
  ·XML Schema内容模型是开放的,可以随意扩充,而DTD无法解析扩充的内容。PHPChina 开源社区门户6`8g*y1W8X@ G)Me.[
  
0{eL6]7z q;}0  ·DTD只能把内容类型定义为一个字符串,而XML Schema允许把内容类型定义为整型、浮点型、布尔型或者许多其它的简单数据类型。PHPChina 开源社区门户w ~,[{"~)YU\0e
  
v_l9V/V9g/w0  ·XML Schema利用Namespaces将文档中特殊的节点与Schema相联系,一个XML文件可以有多个对应的Schema,而一个XML文件只能有一个DTD。PHPChina 开源社区门户Wm"TX:d cM
  
Il([{S~0  3、 XLinkPHPChina 开源社区门户5a$DT-W5u H,sZ
  
;_0T4Pv~$p k&|.m0  作为一种Web语言,XML的链接能力是非常重要的。XML的链接和定址机制包括XLink、XPath和XPointer。XLink提供功能强大的链接方法,可以在文档之间建立单向或多向的复杂联结关系,还有注释链接、概要链接、扩展链接集等多种链接功能。XPath在XSLT和XPointer中使用,支持在XML文档中相对于节点和节点集的定位。XPointer在XPath的基础上提供对XML文档的内容的内部结构(如一个字符串或者选择的一个段落)的定位。XML的链接能力比HTML有了很大的增强。
7Myo8f[*b0  
8Ec3T+a1o+M0  4、 CSS与XSL
)k%w yX d)dnDZ0  PHPChina 开源社区门户G%Y _u3CE+h4G
  XML的一大特点就是内容与格式分离,也就是说,XML文档中并不包含如何显示/表示文档的信息。CSS与XSL(XML Style Language)解决了XML文档的显示问题。
t M_|wY0  PHPChina 开源社区门户S"Tj@o vJ-^
  CSS(层叠样式表)也可以用在HTML和XML中。XSL完全使用XML的语法,功能比CSS要强大得多。
K{/c&nF Z0  
`oE3s1|b0  5、 DOM
.g"@B _^9qr3^0  PHPChina 开源社区门户 \%E*v3B(\8JAfv
  文档对象模型(DOM)是一个与平台、语言无关的程序接口,它提供了动态访问和更新文档的内容、结构与风格的手段。可以对文当作进一步的处理,并将处理的结果更新到表示页面。PHPChina 开源社区门户*[4?'Wg/p
  
"t9b5Sg;SC0  DOM的目标就是为XML和HTML定义一个标准的编程接口,它包括核心、HTML和XML三部分。DOM的核心部分建立了一套底层的对象集,它们可以表示任何结构化的文档。HTML和XML提供了高层的接口,可以作为更方便的文档视图。DOM规范由对象和方法组成。程序员使用它们可以更容易地对特定类型的文档进行访问和操作。PHPChina 开源社区门户$C9nN'c| F5C
  
i6f"BA`)]0  6、 NamespacesPHPChina 开源社区门户_]3~-ivc,R(vp7L D
  
TQ(lz8Q5e:x^wG0  Namespaces是用URL加以区别的、在XML文件的元素和属性中出现的所有名称的集合。在XML中,用户可以自己定义标记和元素。因此,如果把多个XML文件合并为一个,就很可能出现冲突。Namespaces则解决了这个问题。
f ` Nzox!k0  
@TUh;q3C:D0  四、PHP对XML的支持
q5k;R/Gf#Ez)F&@0  
bE+Bez$e0  PHP对XML提供了的强大的支持。它使用了一个XML的“解析器”,并且为了支持这个解析器,它提供了20(PHP4)个XML的解析函数。下面是几个最常用的PHP解析函数。PHPChina 开源社区门户K4fz5KP*R
  
;n-]2C ^QQ E _0  1. xml_parsePHPChina 开源社区门户GI e/TS)S6GG
  PHPChina 开源社区门户y&q8GWV-D1z;D8@&p*^7hD
  boolean xml_parse(int parser, string data, int [isFinal]);
+rKC m&L2z0  PHPChina 开源社区门户V8d%w'~ L v6r`9oP'x
  本函数用来解析 XML 格式的文件资料。参数 parser 为解析代码。参数 data 为解析的资料区块 (chunk)。参数 isFinal 可省略,若设为 true 则系统会自动送出最后的资料部分 (piece) 给 data 参数。若无错误则返回 true 值。
Knv}7M.X*N{7xL#d0  
jy?X(V/sfa0  2. xml_parser_create
]:D6M"paRl0  
uk3J/t"J^dN0  int xml_parser_create(string [encoding]);
N {H8i*r0  PHPChina 开源社区门户{Dh)Ox
  本函数用来初始化一个新的 XML 解析器。参数 encoding 可省略,为 XML 使用的字符集,默认值为 ISO-8859-1,其它尚有 US-ASCII、UTF-8 二种。成功则返回 parser 代码供其它函数使用,失败则返回 false 值。
y{5i"h&hed0  
wGJ"rl`U'e0  3. xml_set_element_handler
y1O c&mn G-D+{0  PHPChina 开源社区门户8u6{ Xyy!j j1|
  boolean xml_set_element_handler(int parser, string startElementHandler, string endElementHandler);PHPChina 开源社区门户j,D#tRN t^tVk
  PHPChina 开源社区门户h,AZ"IyLO
  本函数配置元素的标头供 xml_parse() 函数使用。参数 parser 为解析代码。参数 startElementHandler 及 endElementHandler 分别为元素开始与结束的标头,其中的 startElementHandler 必须包括解析代码、名称、与属性,而 endElementHandler 参数包括了解析代码及名称二个参数。若无错误则返回 true 值。PHPChina 开源社区门户+V@4db!CRf-_
  PHPChina 开源社区门户o;]U5w4G T5hX*{
  4. xml_set_character_data_handlerPHPChina 开源社区门户0H\,O4`_o
  
M[T$p)V F0  boolean xml_set_character_data_handler(int parser, string handler);PHPChina 开源社区门户#c'?,o2I kj@_
  
kUGq [0  PHPChina 开源社区门户P-M2BH%V"k,mv
  本函数配置字符资料的标头。参数 parser 为解析代码。参数 handler 包括解析代码及资料字符串等二个元素。若无错误则返回 true 值。
:]^|}}+f0  
*DJ!q3uz$AOA!}0  5. xml_get_error_codePHPChina 开源社区门户ys`P F
  
'W*M0c5T)cQM"P$E0  int xml_get_error_code(int parser);PHPChina 开源社区门户e(g|A0_AF$t
  PHPChina 开源社区门户y j'^q3HUC yU m
  本函数可取得 XML 在处理时的错误代码。参数 parser 为解析代码。若 parser 有错则返回 false 值,否则就返回错误代码 (如 XML_ERROR_BINARY_ENTITY_REF .... 等等)。
ZF!d/] t%m0  
| F"Ny E:r] `/{0  6. xml_error_string
m Mr7J6z:s2?0  PHPChina 开源社区门户V VJ*cv&?8o
  string xml_error_string(int code);PHPChina 开源社区门户UO1ji$^8xt7lR
  PHPChina 开源社区门户naJ:xq ?
  本函数可取得 XML 在处理时的错误代码。参数 code 为解析错误代码。若无错误返回值为代码的文字描述字符串。PHPChina 开源社区门户_ S_o2}t5u3b)`*m4o2b
  
H$U[]^/z]MuI;Q0  7. xml_get_current_line_number
r9M ci(L0  PHPChina 开源社区门户-aY+x'iqU$W
  int xml_get_current_line_number(int parser);PHPChina 开源社区门户 Ix-};tulS T3RD
  
\;K-yJ#~#xa!Gp0  本函数用来取得目前 XML 解析所正在处理的行号。参数 parser 为解析代码。若 parser 有错则返回 false 值,若无错误则返回行号数字。
gu#Z O0Pa#X o2\0  
UQ,[Z i xZT9jK `&Wy0  8. xml_parser_free
#m1Z;~&D?"ntG0  
{7C/^*N ud*y8~D;U0  boolean xml_parser_free(int parser);
cc)w(y g$h{0  PHPChina 开源社区门户n9xu,j Sq E"r8H
  本函数用来释放目前 XML 解析所使用的内存。参数 parser 为解析代码。若没有错误则返回 true 值,否则返回 false 值。PHPChina 开源社区门户{#R.Ji J n H+}+k*`V
  PHPChina 开源社区门户&AS.Xj9FQTet `
  五、案例解析
!HR%J gN+ju0  
?%v Xa\0  以下是用PHP5实现读取一个以XML 1.0格式编写的通讯录address.xml,并显示其内容的示例。详解见有关注释。
1p-EfN6K3G7u"w0  PHPChina 开源社区门户b3a7Y+h5H@q\L^
  <?
/IG6lM5AcCO k0  //
S3n8FH0GO0  //第一部分:几个PHP Helper函数PHPChina 开源社区门户Y }*iH+G&u'f o
  //
XV s.|5h4s0  
:X]/]!_9x%V-C+DR0  /**********************************
|]4wya)j)G Z0  
-`%{4y0QQ0Z/H0  *从一个文件中读取XML的 *PHPChina 开源社区门户!r?r._V
  *内容到字符串中 *PHPChina 开源社区门户W |'N d]dHS v B
  
-z/G7m3hf*g0  *********************************/PHPChina 开源社区门户#Z$K_m$`,rP$C
  PHPChina 开源社区门户V `\:Mw^
  function read_file($filename)
&}(B+MvG r:sV,y0  {PHPChina 开源社区门户b9LP4zy(O
  //读取文件PHPChina 开源社区门户\%l{KV;hR%k#x` g
  $lines=file($filename);
9Z{ ixd'v1w?0  //变量$contents是存放文件内容的变量
x yWJ2RP4L0  $contents="";PHPChina 开源社区门户3w@,`/T*| g
  while(list($key,$value)=each($lines))PHPChina 开源社区门户z$c+mtj4b'~
  {PHPChina 开源社区门户 v3l,|c:vu H
  $contents.=$value;PHPChina 开源社区门户8C3},]/X]
  }
1?Y vR+C ct0  return $contents;
MKC5E uHc[0  }
(pvtL }c2EW%d h0  
;~(W/c;S k g%n0  /*********************************
.U4?0^-F QBzWA"z0  *当PHP遇到一个XML的起始标记时 *
M7w4rX ^0  *调用,其作用是按照一定的层次 *
wKnP0E;K9KA0t0  *显示出XML的标记 *
L,]#b:\J5z n"d#A0  *********************************/PHPChina 开源社区门户%y(BFw,e7`W2__Aj
  PHPChina 开源社区门户3BO,X.\"fE/C9E D
  function start_element($parser, $name, $attrs)PHPChina 开源社区门户 H,zN:Otht t
  {
,~$L GmA0  //变量$depth存放标记的深度PHPChina 开源社区门户{2C4IFZi'L
  global $depth;PHPChina 开源社区门户es%rK1i-~
  //变量$spacer存放标记前所有的箭头符号
geg$CQ*~-k0  $spacer="";
m|,Z5QvK+D0  for ($i=1;$i<$depth[$parser];$i++)
v8ZSr'b"_0  {PHPChina 开源社区门户iP$dc%Ge7K
  $spacer.="->";
U|@VG w0  }PHPChina 开源社区门户t|!QiX1x
  //设置标记显示时的颜色PHPChina 开源社区门户X(oo6T8^A p$dqI
  if($depth[$parser]==0)PHPChina 开源社区门户6Q%L*S$LeML ~i8WQ;k
  {
Apog!I3d/{.?K w0  $font_color="red";PHPChina 开源社区门户T^ P5v1Pg;_
  }PHPChina 开源社区门户[f jh \
  elsePHPChina 开源社区门户'J:O5L.pS2z
  if($depth[$parser]==1)PHPChina 开源社区门户l.r5@] I2r%HyJ\/_
  {
L)G0S Z d9{0  $font_color="green";PHPChina 开源社区门户rDv$@;Z+e
  }
XV@z ?-zf;y0  else
2M)I4du)D#Ui!Y0  {
-F HNU$f3^{B Me0  $font_color="blue";
F S!J_AG8qYC0  }
r i,M^ Uej6h~M0  //设置标记显示时的字体PHPChina 开源社区门户*u#BA&y;?v
  $font_size=5-$depth[$parser];
v?4U0^t0  if ($font_size<2)PHPChina 开源社区门户 J5N._rrc
  {
q u yoUu~#R9T K0  $font_size=2;PHPChina 开源社区门户~Y b R7L4eJ
  }PHPChina 开源社区门户"Z&Y C+aV
  //显示标记PHPChina 开源社区门户0a0om!d1WUJ5l)O
  echo "<font size=".$font_size." color=".$font_color.">";
~ x/Y(cD;[)h Y0M O0  echo $spacer.$depth[$parser];
lR'e%e[G MP'};V0  if ($depth[$parser]<>0)
2}n.UO|0  {PHPChina 开源社区门户$F'{7ed7q,zrvk8d1~
  echo "、";PHPChina 开源社区门户f^YRz~*h(a
  }
Mo&Qcd!N0o0  echo $name."<BR>";
5A9WQ5o0\M2yGc G)^0  echo "</font>";PHPChina 开源社区门户:mn4xv.bv
  $depth[$parser]++;PHPChina 开源社区门户1Oo/n8M6Gh#^6J
  //如果是主标记就显示红色的水平线PHPChina 开源社区门户v(r"bMANaxY
  if($depth[$parser]==2)
W(de9~ vBG0  {
L/i!x%K0PnX4LIk q0  echo "<hr color=red size=1>";
U2yah A z6c0  }PHPChina 开源社区门户$bOxE9}o@R
  }
Z'Zy.K _$W1N B0  
Q(t&d+Ia;xM%?j$P0  /*********************************
4Os9M{m };vy2Y |(u0  *当PHP遇到一个XML的结束标记时 *
M#Vd/Ho0  *调用,其作用是改变当前的层次 *
,jX+Ek3Bj7Tkg0  *计数,并在主标记下显示水平线 *PHPChina 开源社区门户0S*ox-\(c

TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

数据统计

  • 访问量: 28859
  • 日志数: 99
  • 图片数: 1
  • 建立时间: 2006-10-25
  • 更新时间: 2007-02-06

RSS订阅

Open Toolbar