php

位置:IT落伍者 >> php >> 浏览文章

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


发布日期:2023年08月29日
 
用PHP与XML联手进行网站编程

小序

HTML简单易学又通用一般的php程序就是嵌入在HTML语言之中实现的但是随着WEB越来越广泛的应用HTML的弱点也越来越明显了xml的出现弥补了这些不足它提供了一个能够处理互联网上全部数据的通用方法

HTML的局限性分析

HTML的可扩展性差虽然作为一般的应用HTML应经够用了但是在处理数学和化学等符号时HTML有明显的缺点而且它无法进行扩展这样使它的发展收到了极大的限制

链路丢失后不能自动纠正由于Web页面的URL地址经常改变而在改变URL地址时必须手工修改这些信息否则就会遇到“URL地址未找到”的信息这大大加重了Web页面的维护工作量


数据搜索的时间长由于HTML主要用来对网页的显示进行控制导致了同一个数据在不同的网页中有不同的存储格式这样在进行数据搜索时就无法快速找到所需的资料

HTML对双字节或者多国文字的支持不够例如中文信息页面在不同的平台下会出现无法显示等问题

正是由于这些缺点人们研究了能够代替HTML的Web页面制作语言其中已经投入使用的有可扩展标记语言XML层叠样式表(CSS)以及动态HTML(DHTML)等

XML的组成

这里简要列举几种主要的XML技术

DTD(文档类型声明)

DTD的主要功能是定义XML的内容模式限制XML标记的数据范围定义属性的数据类型但由于它不是用XML编写的因此扩展性比较差而且只提供了有限的几种数据类型因此它的作用是有限的

XML Schema

XML Schema的作用和DTD类似但不同的是Schema文件所描述的是引用它的XML文件中的元素和属性的具体类型另外由于它是由XML编写的Schema和DTD相比较还有以下优点

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

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

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

XLink

作为一种Web语言XML的链接能力是非常重要的XML的链接和定址机制包括XLinkXPath和XPointerXLink提供功能强大的链接方法可以在文档之间建立单向或多向的复杂联结关系还有注释链接概要链接扩展链接集等多种链接功能XPath在XSLT和XPointer中使用支持在XML文档中相对于节点和节点集的定位XPointer在XPath的基础上提供对XML文档的内容的内部结构(如一个字符串或者选择的一个段落)的定位XML的链接能力比HTML有了很大的增强

CSS与XSL

XML的一大特点就是内容与格式分离也就是说XML文档中并不包含如何显示/表示文档的信息CSS与XSL(XML Style Language)解决了XML文档的显示问题

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

DOM
文档对象模型(DOM)是一个与平台语言无关的程序接口它提供了动态访问和更新文档的内容结构与风格的手段可以对文当作进一步的处理并将处理的结果更新到表示页面


DOM的目标就是为XML和HTML定义一个标准的编程接口它包括核心HTML和XML三部分DOM的核心部分建立了一套底层的对象集它们可以表示任何结构化的文档HTML和XML提供了高层的接口可以作为更方便的文档视图DOM规范由对象和方法组成程序员使用它们可以更容易地对特定类型的文档进行访问和操作

Namespaces

Namespaces是用URL加以区别的在XML文件的元素和属性中出现的所有名称的集合在XML中用户可以自己定义标记和元素因此如果把多个XML文件合并为一个就很可能出现沖突Namespaces则解决了这个问题

PHP对XML的支持

PHP对XML提供了的强大的支持它使用了一个XML的“解析器”并且为了支持这个解析器它提供了(PHP)个XML的解析函数下面是几个最常用的PHP解析函数

xml_parse

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

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

xml_parser_create

int xml_parser_create(string [encoding]);

本函数用来初始化一个新的 XML 解析器参数 encoding 可省略为 XML 使用的字符集默认值为 ISO其它尚有 USASCIIUTF 二种成功则返回 parser 代码供其它函数使用失败则返回 false 值

xml_set_element_handler

boolean xml_set_element_handler(int parser string startElementHandler string endElementHandler)

本函数配置元素的标头供 xml_parse() 函数使用参数 parser 为解析代码参数 startElementHandler 及 endElementHandler 分别为元素开始与结束的标头其中的 startElementHandler 必须包括解析代码名称与属性而 endElementHandler 参数包括了解析代码及名称二个参数若无错误则返回 true 值

xml_set_character_data_handler

boolean xml_set_character_data_handler(int parser string handler);


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

xml_get_error_code

int xml_get_error_code(int parser);

本函数可取得 XML 在处理时的错误代码参数 parser 为解析代码若 parser 有错则返回 false 值否则就返回错误代码 (如 XML_ERROR_BINARY_ENTITY_REF 等等)

xml_error_string

string xml_error_string(int code);

本函数可取得 XML 在处理时的错误代码参数 code 为解析错误代码若无错误返回值为代码的文字描述字符串

xml_get_current_line_number

int xml_get_current_line_number(int parser);

本函数用来取得目前 XML 解析所正在处理的行号参数 parser 为解析代码若 parser 有错则返回 false 值若无错误则返回行号数字

xml_parser_free

boolean xml_parser_free(int parser);

本函数用来释放目前 XML 解析所使用的内存参数 parser 为解析代码若没有错误则返回 true 值否则返回 false 值

案例解析

以下是用PHP实现读取一个以XML 格式编写的通讯录addressxml并显示其内容的示例详解见有关注释

<?
//
//第一部分几个PHPHelper函数
//

/*********************************

*从一个文件中读取XML的 *
*内容到字符串中 *

*********************************/

function read_file($filename)
{
//读取文件
$lines=file($filename);
//变量$contents是存放文件内容的变量
$contents="";
while(list($key$value)=each($lines))
{
$contents=$value;
}
return $contents;
}

/*********************************
*当PHP遇到一个XML的起始标记时 *
*调用其作用是按照一定的层次 *
*显示出XML的标记 *
*********************************/

function start_element($parser $name $attrs)
{
//变量$depth存放标记的深度
global $depth;
//变量$spacer存放标记前所有的箭头符号
$spacer="";
for ($i=;$i<$depth[$parser];$i++)
{
$spacer=">";
}
//设置标记显示时的颜色
if($depth[$parser]==)
{
$font_color="red";
}
else
if($depth[$parser]==)
{
$font_color="green";
}
else
{
$font_color="blue";
}
//设置标记显示时的字体
$font_size=$depth[$parser];
if ($font_size<)
{
$font_size=;
}
//显示标记
echo "<font size="$font_size" color="$font_color">";
echo $spacer$depth[$parser];
if ($depth[$parser]<>)
{
echo "";
}
echo $name"<BR>";
echo "</font>";
$depth[$parser]++;
//如果是主标记就显示红色的水平线
if($depth[$parser]==)
{
echo "<hr color=red size=>";
}
}

/*********************************
*当PHP遇到一个XML的结束标记时 *
*调用其作用是改变当前的层次 *
*计数并在主标记下显示水平线 *
*********************************/

function stop_element($parser$name)
{
//变量$depth存放标记的深度
global $depth;
$depth[$parser];
//如果是主标记就显示红色的水平线
if($depth[$parser]==)
{
echo "<hr color=red size=>";
}
}

/*********************************
*当PHP遇到一个XML的标记内容时 *
*调用其作用是按照一定的层次 *
*显示出标记的内容 *
*********************************

function char_data($parser$data)
{
//变量$depth存放标记的深度
global $depth;
//显示标记的内容
$data=trim($data);
if (strlen($data))
{
for ($i=;$i<$depth[$parser]+;$i++)
echo "&nbsp";
echo "<b>$data</b><br> ";
}
}

//
//第二部分PHP文件开始执行处
//
//要解析的XML文件的名字

$file="addressxml";
//读取文件
$data=read_file($file);

// 产生解析器的实例
$parser = xml_parser_create();
// 设置处理函数
xml_set_element_handler($parser "start_element" "stop_element");
xml_set_character_data_handler($parser "char_data");
// 解析文件
if(!xml_parse($parser$data))
{
//报错
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);
?>

               

上一篇:php设计模式之观察者模式的应用详解

下一篇:PHP程序编译中常见错误信息及解释