轻量级的XML文档生成类

 更新时间:2016年11月25日 16:55  点击:1727

PHP代码:
<?
/**
* 轻量级XML文档生成类(非dom)
* 支持Element/CDATA/Declare/attribute/Comment,可选择是否包含换行和缩进
*/
class xml {

/** 元素名 */
var $name;
/** 元素值 */
var $value;
/** 元素类型 */
var $type;
/** 元素属性 */
var $attrib;
/** XML声明 */
var $declare;
/** 是否缩进换行 */
var $space;

/** 构造函数 */
function xml($name='',$value='') {
$this->name = $name;
$this->value = $value;
$this->declare = array();
$this->setTypes('Element');
$this->setAttrib(array());
$this->setSpace(false);
}

/** 设置元素类型 */
function setTypes($type) {
$this->type = $type;
}

/** 设置是否缩进换行 */
function setSpace($space) {
$this->space = $space;
}

/** 设置元素属性 */
function setAttrib($name,$value='') {
if(is_array($name)) {
$this->attrib = array_merge($this->attrib,$name);
}else {
$this->attrib[$name] = $value;
}
}

/** 添加子元素 */
function &addElement($name='',$value='') {
if(!is_array($this->value)) {
$this->value = array();
}
$xml = new xml($name,$value);
$xml->setSpace($this->space);
$this->value[] = &$xml;
return $this->value[sizeof($this->value)-1];
}

/** 添加CDATA数据 */
function &addCDATA($name='',$value='') {
if(!is_array($this->value)) {
$this->value = array();

今天听同事说要用xml 文件与flash进行交互,今天就试着来写一个看看,但用DOMdocument这种知道为什么多行时就出现问题,所以想到用fopen来生成了,很简单的,

$head ='<?xml version="1.0" encoding="gb2312" ?> <channel>';
$stp  ='<item><title>这么简单啊,真的是爽啊.</title><link>http://www.111cn.net</link><data>2008-02-28</data></item>';
for($i=1;$i<=4;$i++){
 $stp .=$stp;
}
$foot ='</channel>';
$cont =fopen("test.xml",'w');
fwrite($cont,$head.$stp.$foot);
fclose($cont);

 综述

  XML代表Extensible Markup Language(eXtensible Markup Language的缩写,意为可扩展的标记语言)。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。XML是当今最热门的技术。而PHP也具有分析XML文档的功能,下面我们将共同探讨一下PHP中的XML应用的情况。
  XML概貌

  谈起XML(eXtended Markup Language:可扩展标记语言),我们不妨先看一段HTML的代码:

  <html>
  <title>XML</title>
  <body>
  <p><center><font color="red">TEXT</font></center></p>
  <a href="www.domain.com"><img src="logo.jpg"/></a>
  </body>
  </html>

  上面这段代码从结构上就符合XML的规则,XML可以理解是包含数据的树形的结构类型:

  1、引用同一个元素的时候,使用一致的大小写,如<center></Center>就是不符合规定的
  2、任何属性值(如 href="????")要用""引起来,如<a href=www.yahoo.com>就是不正确的
  3、所有元素必须由打开<和关闭>标注组成,元素应该形如<body></body>或空元素<img ... />,假如结尾的 "/>" 少了"/"就是错误的代码
  4、所有元素必须彼此嵌套,就像写程序的循环一样,而且,所有的元素必须嵌套于根元素之中,比如上面的代码所有的内容都嵌套于<html></html>之中。
  5、元素名称(即上面的body a p img等)应为字母开头。
  怎样应用PHP的XML解析器Expat?

  Expat是PHP脚本语言的XML解析器(同样称为XML处理器),可以使程序访问XML文档的结构和内容。它是一种基于事件的解析器。XML解析器有两种基本类型:

  基于树型的解析器:将XML文档转换成树型结构。这类解析器分析整篇文章,同时提供一个API来访问所产生树的每个元素。其通用的标准为DOM(文档对象模式)。

  基于事件的解析器:将XML文档视为一系列的事件。当一个非凡事件发生时,解析器将调用开发者提供的函数来处理。基于事件的解析器有一个XML文档的数据集中视图,也就是说它集中在XML文档的数据部分,而不是其结构。这些解析器从头到尾处理文档,并将类似于-元素的开始、元素的结尾、特征数据的开始等等-事件通过回调(callback)函数报告给应用程序。

  以下是一个"Hello-World"的XML文档范例:

<greeting>
Hello World
</greeting>

  基于事件的解析器将报告为三个事件:

  开始元素:greeting
  CDATA项的开始,值为:Hello World
  结束元素:greeting

  基于事件的解析器不产生描述文档的结构,当然假如使用Expat,必要时它一样可以在PHP中生成完全的原生树结构。在CDATA项中,基于事件的解析器不会得到父元素greeting的信息。然而,它提供一个更底层的访问,这就使得可以更好地利用资源和更快地访问。通过这种方式,就没有必要将整个文档放入内存;而事实上,整个文档甚至可以大于实际内存值。

  上面Hello-World的范例虽然包括完整的XML格式,但它是无效的,因为既没有DTD(文档类型定义)与其联系,也没有内嵌DTD。但是Expat是一个不检查有效性的解析器,因此忽略任何与文档联系的DTD。应注重的是文档仍然需要完整的格式,否则Expat(和其他符合XML标准的解析器一样)将会随着出错信息而停止。
  编译Expat

  Expat可以编译进PHP3.0.6版本(或以上)中。从Apache1.3.22开始,Expat已经作为Apache的一部分。在Unix系统中,可以通过-with-xml选项配置PHP将其编译入PHP。

  假如将PHP编译为Apache的模块,而Expat将默认作为Apache的一部分。在Windows中,则必须要加载XML动态连接库。

  XML范例:XMLstats
  我们所要讨论的范例是使用Expat来收集XML文档的统计数据。

  对于文档中每个元素,以下信息都将被输出:
该元素在文档中使用的次数
该元素中字符数据的数量
元素的父元素
元素的子元素


  注重:为了演示,我们利用PHP来产生一个结构来保存元素的父元素和子元素.
 用于产生XML解析器实例的函数有哪些?

  用于产生XML解析器实例的函数为xml_parser_create()。该实例将用于以后的所有函数。这个思路非常类似于PHP中MySQL函数的连接标记。在解析文档前,基于事件的解析器通常要求注册回调函数-用于特定的事件发生时调用。Expat没有例外事件,它定义了如下七个可能事件:

首先我得承认我喜欢计算机标准。假如每个人都遵从这个行业的标准,互联网将会是一个更好的媒体。使用标准化的数据交换格式才能使开放的和独立于平台的计算模式切实可行。这就是我作为XML爱好者的原因。

幸运的是,我最喜爱的脚本语言不但支持XML而且对其支持正不断加强。PHP可以让我迅速将XML文档发布到互联网上,收集XML文档的统计信息,将XML文档转换成其它格式。例如,我时常用PHP的XML处理能力来治理我用XML所写的文章和书。

本文中,我将讨论任何用PHP内建的Expat解析器来处理XML文档。通过范例,我将演示Expat的处理方法。同时,范例可以告诉你如何:

建立你自己的处理函数
将XML文档转换成你自己的PHP数据结构

介绍Expat

XML的解析器,同样称为XML处理器,可以使程序访问XML文档的结构和内容。Expat是PHP脚本语言的XML解析器。它同时也运用在其它项目中,例如Mozilla、Apache和Perl。

什么是基于事件的解析器?

XML解析器的两种基本类型:

基于树型的解析器:将XML文档转换成树型结构。这类解析器分析整篇文章,同时提供一个API来访问所产生树的每个元素。其通用的标准为DOM(文档对象模式)。
基于事件的解析器:将XML文档视为一系列的事件。当一个非凡事件发生时,解析器将调用开发者提供的函数来处理。
基于事件的解析器有一个XML文档的数据集中视图,也就是说它集中在XML文档的数据部分,而不是其结构。这些解析器从头到尾处理文档,并将类似于-元素的开始、元素的结尾、特征数据的开始等等-事件通过回调(callback)函数报告给应用程序。以下是一个"Hello-World"的XML文档范例:

<greeting>
Hello World
</greeting>

基于事件的解析器将报告为三个事件:

开始元素:greeting
CDATA项的开始,值为:Hello World
结束元素:greeting
不像基于树型的解析器,基于事件的解析器不产生描述文档的结构。在CDATA项中,基于事件的解析器不会让你得到父元素greeting的信息。
然而,它提供一个更底层的访问,这就使得可以更好地利用资源和更快地访问。通过这种方式,就没有必要将整个文档放入内存;而事实上,整个文档甚至可以大于实际内存值。


Expat就是这样的一种基于事件的解析器。当然假如使用Expat,必要时它一样可以在PHP中生成完全的原生树结构。


上面Hello-World的范例包括完整的XML格式。但它是无效的,因为既没有DTD(文档类型定义)与其联系,也没有内嵌DTD。


对于Expat,这并没有区别:Expat是一个不检查有效性的解析器,因此忽略任何与文档联系的DTD。但应注重的是文档仍然需要完整的格式,否则Expat(和其他符合XML标准的解析器一样)将会随着出错信息而停止。


作为不检查有效性的解析器,Exapt的快速性和轻便性使其十分适合互联网程序。


编译Expat

Expat可以编译进PHP3.0.6版本(或以上)中。从Apache1.3.9开始,Expat已经作为Apache的一部分。在Unix系统中,通过-with-xml选项配置PHP,你可以将其编译入PHP。


假如你将PHP编译为Apache的模块,而Expat将默认作为Apache的一部分。在Windows中,你则必须要加载XML动态连接库。

XML范例:XMLstats

了解Expat的函数的一个办法就是通过范例。我们所要讨论的范例是使用Expat来收集XML文档的统计数据。


对于文档中每个元素,以下信息都将被输出:

该元素在文档中使用的次数
该元素中字符数据的数量
元素的父元素
元素的子元素
注重:为了演示,我们利用PHP来产生一个结构来保存元素的父元素和子元素

预备

用于产生XML解析器实例的函数为xml_parser_create()。该实例将用于以后的所有函数。这个思路非常类似于PHP中MySQL函数的连接标记。在解析文档前,基于事件的解析器通常要求你注册回调函数-用于特定的事件发生时调用。Expat没有例外事件,它定义了如下七个可能事件:


对象 XML解析函数 描述

元素 xml_set_element_handler() 元素的开始和结束

字符数据 xml_set_character_data_handler() 字符数据的开始

外部实体 xml_set_external_entity_ref_handler() 外部实体出现

未解析外部实体 xml_set_unparsed_entity_decl_handler() 未解析的外部实体出现

//TABLE

create table tableurl(

id int(5),

sort int(2),

click int(6),

getday date,

name char(30),

link char(40),

brief char(50),

PRIMARY KEY (id)

)

//XML FILE

------------------------------

<?php

require("db.inc.php");

if(empty($order))

{$order='hot';

}

switch($order)

{

case 'hot':

$querystring="select * from tableurl order by click desc LIMIT 20";

break;

case 'new':

$querystring="select * from tableurl order by getday desc LIMIT 20";

}

$result=mysql_query($querystring,$db);

echo "<?xml version="1.0" encoding="gb2312"?>n";

echo "<?xml-stylesheet type="text/xsl" href="sitelist.xsl"?>";

[!--infotagslink--]

相关文章

  • php二维码生成

    本文介绍两种使用 php 生成二维码的方法。 (1)利用google生成二维码的开放接口,代码如下: /** * google api 二维码生成【QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式】 * @param strin...2015-10-21
  • Java生成随机姓名、性别和年龄的实现示例

    这篇文章主要介绍了Java生成随机姓名、性别和年龄的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-10-01
  • C#生成随机数功能示例

    这篇文章主要介绍了C#生成随机数功能,涉及C#数学运算与字符串操作相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php生成唯一数字id的方法汇总

    关于生成唯一数字ID的问题,是不是需要使用rand生成一个随机数,然后去数据库查询是否有这个数呢?感觉这样的话有点费时间,有没有其他方法呢?当然不是,其实有两种方法可以解决。 1. 如果你只用php而不用数据库的话,那时间戳+随...2015-11-24
  • jQuery为动态生成的select元素添加事件的方法

    下面小编就为大家带来一篇jQuery为动态生成的select元素添加事件的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-09-01
  • PHP自动生成后台导航网址的最佳方法

    经常制作开发不同的网站的后台,写过很多种不同的后台导航写法。 最终积累了这种最写法,算是最好的吧...2013-09-29
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • js生成随机数的方法实例

    js生成随机数主要用到了内置的Math对象的random()方法。用法如:Math.random()。它返回的是一个 0 ~ 1 之间的随机数。有了这么一个方法,那生成任意随机数就好理解了。比如实际中我们可能会有如下的需要: (1)生成一个 0 - 1...2015-10-21
  • PHP验证码生成与验证例子

    验证码是一个现在WEB2.0中常见的一个功能了,像注册、登录又或者是留言页面,都需要注册码来验证当前操作者的合法性,我们会看到有些网站没有验证码,但那是更高级的验证了,...2016-11-25
  • PHP生成不同颜色、不同大小的tag标签函数

    复制代码 代码如下:function getTagStyle(){ $minFontSize=8; //最小字体大小,可根据需要自行更改 $maxFontSize=18; //最大字体大小,可根据需要自行更改 return 'font-size:'.($minFontSize+lcg_value()*(abs($maxFo...2013-10-04
  • JS生成某个范围的随机数【四种情况详解】

    下面小编就为大家带来一篇JS生成某个范围的随机数【四种情况详解】。小编觉得挺不错的,现在分享给大家,也给大家做个参考,一起跟随小编过来看看吧...2016-04-22
  • php中利用str_pad函数生成数字递增形式的产品编号

    解决办法:$str=”QB”.str_pad(($maxid[0]["max(id)"]+1),5,”0″,STR_PAD_LEFT ); 其中$maxid[0]["max(id)"]+1) 是利用max函数从数据库中找也ID最大的一个值, ID为主键,不会重复。 str_pad() 函数把字符串填充为指...2013-10-04
  • C#生成Word文档代码示例

    这篇文章主要介绍了C#生成Word文档代码示例,本文直接给出代码实例,需要的朋友可以参考下...2020-06-25
  • Vue组件文档生成工具库的方法

    本文主要介绍了Vue组件文档生成工具库的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-11
  • PHP简单实现生成txt文件到指定目录的方法

    这篇文章主要介绍了PHP简单实现生成txt文件到指定目录的方法,简单对比分析了PHP中fwrite及file_put_contents等函数的使用方法,需要的朋友可以参考下...2016-04-28
  • Java开发SpringBoot集成接口文档实现示例

    这篇文章主要为大家介绍了Java开发SpringBoot如何集成接口文档的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-28
  • 史上最简洁C# 生成条形码图片思路及示例分享

    这篇文章主要介绍了史上最简洁C# 生成条形码图片思路及示例分享,需要的朋友可以参考下...2020-06-25
  • 简单入门级php 生成xml文档代码

    $doc = new domdocument('1.0'); // we want a nice output $doc->formatoutput = true; 代码如下 复制代码 $root = $doc->createelement('bo...2016-11-25
  • 解决PHPWord导出生成Word中文乱码问题

    PHPWord是一个可以把相关文件生成word文档的插件了,但由于是老外开发的对于gbk支持不好,所以我们在导出带有中文的word时会出现乱码问题,下面本文就PHPWord中文乱码问题...2016-11-25
  • php 验证码详细生成与使用方法

    注意:以下代码需要打开php教程的gd库,修改php.in文件的配置,把已经注释掉的行之前的分号取消即可:extension=php_gd2.dll。 $width = 165; $height = 120; ...2016-11-25