快捷搜索:

用PHP与XML联手进行网站编程

一、弁言

HTML简单易学又通用,一样平常的PHP法度榜样便是嵌入在HTML说话之中实现的。然则跟着WEB越来越广泛的利用,HTML的弱点也越来越显着了。XML的呈现,增补了这些不够,它供给了一个能够处置惩罚互联网上整个数据的通用措施。

二、HTML的局限性阐发

1、 HTML的可扩展性差。虽然作为一样平常的利用,HTML应经够用了,然则在处置惩罚数学和化学等符号时,HTML有显着的毛病,而且它无法进行扩展,这样使它的成长收到了极大年夜的限定。

2、 链路损掉后不能自动矫正。因为Web页面的URL地址常常改变,而在改变URL地址时必须手工改动这些信息,否则就会碰到“404URL地址未找到”的信息,这大年夜大年夜加重了Web页面的掩护事情量。

3、 数据搜索的光阴长。因为HTML主要用来对网页的显示进行节制,导致了同一个数据在不合的网页中有不合的存储款式,这样在进行数据搜索时就无法快速找到所需的资料。

4、 HTML对双字节或者多国翰墨的支持不敷。例如中文信息页面在不合的平台下会呈现无法显示等问题。

恰是因为这些毛病,人们钻研了能够代替HTML的Web页面制作说话。此中已经投入应用的有:可扩展标记说话XML、层叠样式表(CSS)以及动态HTML(DHTML)等。

三、XML的组成

这里简要枚举几种主要的XML技巧:

1、 DTD(文档类型声明)

DTD的主要功能是定义XML的内容模式;限定XML标记的数据范围;定义属性的数据类型。但因为它不是用XML编写的,是以扩展性对照差;而且只供给了有限的几种数据类型,是以它的感化是有限的。

2、 XML Schema

XML Schema的感化和DTD类似。但不合的是,Schema文件所描述的是引用它的XML文件中的元素和属性的详细类型。别的,因为它是由XML编写的,Schema和DTD相对照还有以下优点:

·XML Schema内容模型是开放的,可以随意扩充,而DTD无法解析扩充的内容。

·DTD只能把内容类型定义为一个字符串,而XML Schema容许把内容类型定义为整型、浮点型、布尔型或者许多其它的简单数据类型。

·XML Schema使用Namespaces将文档中特殊的节点与Schema相联系,一个XML文件可以有多个对应的Schema,而一个XML文件只能有一个DTD。

3、 XLink

作为一种Web说话,XML的链接能力是异常紧张的。XML的链接和定址机制包括XLink、XPath和XPointer。XLink供给功能强大年夜的链接措施,可以在文档之间建立单向或多向的繁杂联络关系,还有注释链接、概要链接、扩展链接集等多种链接功能。XPath在XSLT和XPointer中应用,支持在XML文档中相对付节点和节点集的定位。XPointer在XPath的根基上供给对XML文档的内容的内部布局(如一个字符串或者选择的一个段落)的定位。XML的链接能力比HTML有了很大年夜的增强。

4、 CSS与XSL

XML的一大年夜特征便是内容与款式分离,也便是说,XML文档中并不包孕若何显示/表示文档的信息。CSS与XSL(XML Style Language)办理了XML文档的显示问题。

CSS(层叠样式表)也可以用在HTML和XML中。XSL完全应用XML的语法,功能比CSS要强大年夜得多。

5、 DOM

文档工具模型(DOM)是一个与平台、说话无关的法度榜样接口,它供给了动态造访和更新文档的内容、布局与风格的手段。可以对文算作进一步的处置惩罚,并将处置惩罚的结果更新到表示页面。

DOM的目标便是为XML和HTML定义一个标准的编程接口,它包括核心、HTML和XML三部分。DOM的核心部分建立了一套底层的工具集,它们可以表示任何布局化的文档。HTML和XML供给了高层的接口,可以作为更方便的文档视图。DOM规范由工具和措施组成。法度榜样员应用它们可以更轻易地对特定类型的文档进行造访和操作。

6、 Namespaces

Namespaces是用URL加以区其余、在XML文件的元素和属性中呈现的所着名称的聚拢。在XML中,用户可以自己定义标记和元素。是以,假如把多个XML文件合并为一个,就很可能呈现冲突。Namespaces则办理了这个问题。

四、PHP对XML的支持

PHP对XML供给了的强大年夜的支持。它应用了一个XML的“解析器”,并且为了支持这个解析器,它供给了20(PHP4)个XML的解析函数。下面是几个最常用的PHP解析函数。

1. xml_parse

boolean xml_parse(int parser, string data, int [isFinal]);

本函数用来解析 XML 款式的文件资料。参数 parser 为解析代码。参数 data 为解析的资料区块 (chunk)。参数 isFinal 可省略,若设为 true 则系统会自动送出着末的资料部分 (piece) 给 data 参数。若无差错则返回 true 值。

2. xml_parser_create

int xml_parser_create(string [encoding]);

本函数用来初始化一个新的 XML 解析器。参数 encoding 可省略,为 XML 应用的字符集,默认值为 ISO-8859-1,其它尚有 US-ASCII、UTF-8 二种。成功则返回 parser 代码供其它函数应用,掉败则返回 false 值。

3. xml_set_element_handler

boolean xml_set_element_handler(int parser, string startElementHandler, string endElementHandler);

本函数设置设置设备摆设摆设元素的标头供 xml_parse() 函数应用。参数 parser 为解析代码。参数 startElementHandler 及 endElementHandler 分手为元素开始与停止的标头,此中的 startElementHandler 必须包括解析代码、名称、与属性,而 endElementHandler 参数包括懂得析代码及名称二个参数。若无差错则返回 true 值。

4. xml_set_character_data_handler

boolean xml_set_character_data_handler(int parser, string handler);

本函数设置设置设备摆设摆设字符资料的标头。参数 parser 为解析代码。参数 handler 包括解析代码及资料字符串等二个元素。若无差错则返回 true 值。

5. xml_get_error_code

int xml_get_error_code(int parser);

本函数可取得 XML 在处置惩罚时的差错代码。参数 parser 为解析代码。若 parser 有错则返回 false 值,否则就返回差错代码 (如 XML_ERROR_BINARY_ENTITY_REF .... 等等)。

6. xml_error_string

string xml_error_string(int code);

本函数可取得 XML 在处置惩罚时的差错代码。参数 code 为解析差错代码。若无差错返回值为代码的翰墨描述字符串。

7. xml_get_current_line_number

int xml_get_current_line_number(int parser);

本函数用来取得今朝 XML 解析所正在处置惩罚的行号。参数 parser 为解析代码。若 parser 有错则返回 false 值,若无差错则返回行号数字。

8. xml_parser_free

boolean xml_parser_free(int parser);

本函数用来开释今朝 XML 解析所应用的内存。参数 parser 为解析代码。若没有差错则返回 true 值,否则返回 false 值。

五、案例解析

以下是用PHP5实现读取一个以XML 1.0款式编写的通讯录address.xml,并显示其内容的示例。详解见有关注释。

<?

//

//第一部分:几个PHP Helper函数

//

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫*

*从一个文件中读取XML的 *

*内容到字符串中 *

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

function read_file($filename)

{

//读取文件

$lines=file($filename);

//变量$contents是寄放文件内容的变量

$contents="";

while(list($key,$value)=each($lines))

{

$contents.=$value;

}

return $contents;

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫

*当PHP碰到一个XML的肇端标记时 *

*调用,其感化是按照必然的层次 *

*显示出XML的标记 *

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

function stpa546_element($parser, $name, $attrs)

{

//变量$depth寄放标记的深度

global $depth;

//变量$spacer寄放标记前所有的箭头符号

$spacer="";

for ($i=1;$i<$depth[$parser];$i++)

{

$spacer.="->";

}

//设置标记显示时的颜色

if($depth[$parser]==0)

{

$font_color="red";

}

else

if($depth[$parser]==1)

{

$font_color="green";

}

else

{

$font_color="blue";

}

//设置标记显示时的字体

$font_size=5-$depth[$parser];

if ($font_size<2)

{

$font_size=2;

}

//显示标记

echo "<font size=".$font_size." color=".$font_color.">";

echo $spacer.$depth[$parser];

if ($depth[$parser]<>0)

{

echo "、";

}

echo $name."<BR>";

echo "</font>";

$depth[$parser]++;

//假如是主标记就显示血色的水平线

if($depth[$parser]==2)

{

echo "<hr color=red size=1>";

}

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫

*当PHP碰到一个XML的停止标记时 *

*调用,其感化是改变当前的层次 *

*计数,并在主标记下显示水平线 *

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

function stop_element($parser,$name)

{

//变量$depth寄放标记的深度

global $depth;

$depth[$parser]--;

//假如是主标记就显示血色的水平线

if($depth[$parser]==2)

{

echo "<hr color=red size=1>";

}

}

/奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫

*当PHP碰到一个XML的标记内容时 *

*调用,其感化是按照必然的层次 *

*显示出标记的内容 *

奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫奸淫/

function char_data($parser,$data)

{

//变量$depth寄放标记的深度

global $depth;

//显示标记的内容

$data=trim($data);

if (strlen($data))

{

for ($i=1;$i<$depth[$parser]+6;$i++)

echo " ";

echo "<b>$data</b><br>\n";

}

}

//

//第二部分:PHP文件开始履行处

//

//要解析的XML文件的名字

$file="address.xml";

//读取文件

$data=read_file($file);

// 孕育发生解析器的实例

$parser = xml_parser_create();

// 设置处置惩罚函数

xml_set_element_handler($parser, "stpa546_element", "stop_element");

xml_set_character_data_handler($parser, "char_data");

// 解析文件

if(!xml_parse($parser,$data,1))

{

//报错

die(sprintf("XML error: %s at line %d",

xml_error_string(xml_get_error_code($parser)),

xml_get_current_line_number($parser)));

}

// 开释解析器

xml_parser_free($parser);

?>

您可能还会对下面的文章感兴趣: