php读取xml文件

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

php读取xml文件
<?php
class 
HTTPRequest
{
    var 
$_fp;        
// HTTP socket
    
var $_url;        
// full URL
    
var $_host;        
// HTTP host
    
var $_protocol;    
// protocol (HTTP/HTTPS)
    
var $_uri;        
// request URI
    
var $_port;        
// port
    
    // scan url
    
function _scan_url
()
    {
        
$req $this->_url
;
        
        
$pos strpos($req'://'
);
        
$this->_protocol strtolower(substr($req0$pos
));
        
        
$req substr($req$pos+3
);
        
$pos strpos($req'/'
);
        if(
$pos === false
)
            
$pos strlen($req
);
        
$host substr($req0$pos
);
        
        if(
strpos($host':') !== false
)
        {
            list(
$this->_host$this->_port) = explode(':'$host
);
        }
        else 
        {
            
$this->_host $host
;
            
$this->_port = ($this->_protocol == 'https') ? 443 80
;
        }
        
        
$this->_uri substr($req$pos
);
        if(
$this->_uri == ''
)
            
$this->_uri '/'
;
    }
    
    
// constructor
    
function HTTPRequest($url
)
    {
        
$this->_url $url
;
        
$this->_scan_url
();
    }
    
    
// download URL to string
    
function DownloadToString
()
    {
        
$crlf "\r\n"
;
        
        
// generate request
        
$req 'GET ' $this->_uri ' HTTP/1.0' 
$crlf
            
.    'Host: ' $this->_host 
$crlf
            
.    $crlf
;
        
        
// fetch
        
$this->_fp fsockopen(($this->_protocol == 'https' 'ssl://' '') . $this->_host$this->_port
);
        
fwrite($this->_fp$req
);
        while(
is_resource($this->_fp) && $this->_fp && !feof($this->_fp
))
            
$response .= fread($this->_fp1024
);
        
fclose($this->_fp
);
        
        
// split header and body
        
$pos strpos($response$crlf $crlf
);
        if(
$pos === false
)
            return(
$response
);
        
$header substr($response0$pos
);
        
$body substr($response$pos strlen($crlf
));
        
        
// parse headers
        
$headers 
= array();
        
$lines explode($crlf$header
);
        foreach(
$lines as $line
)
            if((
$pos strpos($line':')) !== false
)
                
$headers[strtolower(trim(substr($line0$pos)))] = trim(substr($line$pos+1
));
        
        
// redirection?
        
if(isset($headers['location'
]))
        {
            
$http = new HTTPRequest($headers['location'
]);
            return(
$http->DownloadToString($http
));
        }
        else 
        {
            return(
$body
);
        }
    }
function 
dhtmlspecialchars($string
) {
  if(
is_array($string
)) {
   foreach(
$string as $key => $val
) {
    
$string[$key] = dhtmlspecialchars($val
);
   }
  } else {
     
$string preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4})|[a-zA-Z][a-z0-9]{2,5});)/''&\\1'
,
     
str_replace(array('&''"''<''>'), array('&''"''<''>'), $string
));
   }
      return 
$string
;
}
function 
returnSubstrings($text$openingMarker$closingMarker
) {
    
$openingMarkerLength strlen($openingMarker
);
    
$closingMarkerLength strlen($closingMarker
);
    
$result 
= array();
    
$position 0
;
    while ((
$position strpos($text$openingMarker$position)) !== false
) {
      
$position += $openingMarkerLength
;
      if ((
$closingMarkerPosition strpos($text$closingMarker$position)) !== false
) {
        
$result[] = substr($text$position$closingMarkerPosition $position
);
        
$position $closingMarkerPosition $closingMarkerLength
;
       }
    }
    return 
$result
;
}
function 
is_mail($Argv
){
        
$RegExp='/^[a-z0-9][a-z\.0-9-_]+@[a-z0-9_-]+(?:\.[a-z]{0,3}\.[a-z]{0,2}|\.[a-z]{0,3}|\.[a-z]{0,2})$/i'
;
        return 
preg_match($RegExp,$Argv)?$Argv:false
;

}
?>


<?php
/*****************************************
*           RSS2.0 Generator
*          Create by MagicBoy(darasion)
*          Copyright ? 神奇男孩 
******************************************/

/*————————————————

使用方法:
将下面的数组,带入相应的函数。

1、频道主体
$channel = array(
title => '频道名称(必备)',
link => '频道的URL(必备)',
description => '频道的描述(必备)',
language => '频道文章所用语言(可选)',
webmaster => '负责频道技术事务的网站管理员email(可选)',
managingEditor => '责任编辑的email(可选)',
pubDate => '频道内容发布日期,格式遵循RFC822格式(年份可为2位或4位)(可选)',
lastBuildDate => '频道内容最后的修改日期(Sat, 07 Sep 2002 09:42:31 GMT)(可选)',
skipDays => '提示新闻聚合器,那些天它可以跳过。(可选)',
copyright => '频道内容的版权说明(可选)',
ttl => '有效期,用以指明该频道可被缓存的最长时间(可选)',
);

2、频道图片
$image = array(
url => '图片的链接(必备)',
title => '图片的标题,用于http的alt属性(必备)',
link => '网站的url(实际中常以频道的url代替)(必备)',
width => '图片的宽度(象素为单位)最大144,默认88(可选)',
height => '图片的高度(象素为单位)最大400,默认31(可选)',
description => '用于link的title属性(可选)' 
   );

3、频道项
$item = array(
title => '项(item)的标题(必备)',
description => '项的大纲(必备)',
link => '项的URL(必备)',
comments => '该项的评论(comments)页的URL(可选)',
guid => '1项的唯一标志符串(可选)',
author => '该项作者的email(可选)',
enclosure => '描述该附带的媒体对象(可选)',
category => '包含该项的一个或几个分类(catogory)(可选)',
pubdate => '项的发布时间(可选)',
source_url => '该项来自的RSS道(可选)',
source_name => '该项来自的RSS道(可选)'
);
————————————————*/

class 
rss2
{
var 
$channel_pre=""
;
var 
$str_image=""
;
var 
$str_item=""
;
var 
$channel_end=""
;
/*构造函数*/
function rss2($channel,$encoding="GB2312"
)
  {
   
$this->channel($channel,$encoding
);
  }
/*生成频道主体*/
function channel($channel,$encoding="GB2312"
)
  {
  
$this->channel_pre.="<?xml version=\"1.0\" encoding=\"$encoding\"?>\n"
;
  
$this->channel_pre.= "<rss version=\"2.0\">\n"
;

  
$this->channel_pre.= " <channel>\n"
;

  
$this->channel_pre.= "  <title>".$channel['title']."</title>\n";
//频道名称(必备)
  
$this->channel_pre.= "  <link>".$channel['link']."</link>\n";
//频道的URL(必备)
  
$this->channel_pre.= "  <description>".$channel['description']."</description>\n";
//频道的描述(必备)
  
$this->channel_pre.= "  <generator>MagicBoy RSS Generator v1.0</generator>\n";
//创建此文档的程序(可选)

  
if(isset($channel['language']))$this->channel_pre.= "  <language>".$channel['language']."</language>\n";
//频道文章所用语言(可选)
  
if(isset($channel['webmaster']))$this->channel_pre.= "  <webMaster>".$channel['webmaster']."</webMaster>\n";
//负责频道技术事务的网站管理员email(可选)
  
if(isset($channel['managingeditor']))$this->channel_pre.= "  <managingEditor>".$channel['managingeditor']."</managingEditor>\n";
//责任编辑的email(可选)
  
if(isset($channel['pubdate']))$this->channel_pre.= "  <pubDate>".$channel['pubdate']."</pubDate>\n";
//频道内容发布日期,格式遵循RFC822格式(年份可为2位或4位)(可选)
  
if(isset($channel['lastbuilddate']))$this->channel_pre.= "  <lastBuildDate>".$channel['lastbuilddate']."</lastBuildDate>\n";
//频道内容最后的修改日期(Sat, 07 Sep 2002 09:42:31 GMT)(可选)
  
if(isset($channel['skipdays']))$this->channel_pre.= "  <skipDays>".$channel['skipdays']."</skipDays>\n";
//提示新闻聚合器,那些天它可以跳过。(可选)
  
if(isset($channel['copyright']))$this->channel_pre.= "  <copyright>".$channel['copyright']."</copyright>\n";
//频道内容的版权说明(可选)
  
if(isset($channel['ttl']))$this->channel_pre.= "  <ttl>".$channel['ttl']."</ttl>\n";
//有效期,用以指明该频道可被缓存的最长时间(可选)

  
$this->channel_end.= " </channel>\n"
;
  
$this->channel_end.= "</rss>\n"
;
}
/*生成频道图片*/
function image($image
)
{
  if(isset(
$this->str_image))unset($this->str_image
);
  
$this->str_image.= "  <image>\n"
;
  if(isset(
$image['url']))$this->str_image.= "   <url>".$image['url']."</url>\n";
//图片的url(必备)
  
if(isset($image['title']))$this->str_image.= "   <title>".$image['title']."</title>\n";
//图片的标题,用于http的alt属性(必备)
  
if(isset($image['link']))$this->str_image.= "   <link>".$image['link']."</link>\n";
//网站的url(实际中常以频道的url代替)(必备)
  
if(isset($image['width']))$this->str_image.= "   <width>".$image['width']."</width>\n";
//图片的宽度(象素为单位)最大144,默认88(可选)
  
if(isset($image['height']))$this->str_image.= "   <height>".$image['height']."</height>\n";
//图片的高度(象素为单位)最大400,默认31(可选) 
  
if(isset($image['description']))$this->str_image.= "   <description>".$image['description']."</description>\n";
//用于link的title属性(可选)
  
$this->str_image.= "  </image>\n"
;
}
/*频道项*/
function item($item
)
{
  
$this->str_item.="  <item>\n"
;
  
$this->str_item.="   <title>".$item['title']."</title>\n";
//项(item)的标题(必备)
  
$this->str_item.="   <description>".$item['description']."</description>\n";
//项的大纲(必备)
  
$this->str_item.="   <link>".$item['link']."</link>\n";
//项的URL(必备)

  
if(isset($item['comments']))$this->str_item.="   <comments>".$item['comments']."</comments>\n";
//该项的评论(comments)页的URL(可选)
  
if(isset($item['guid']))$this->str_item.="   <guid>".$item['guid']."</guid>\n";
//1项的唯一标志符串(可选)
  
if(isset($item['author']))$this->str_item.="   <author>".$item['author']."</author>\n";
//该项作者的email(可选)
  
if(isset($item['enclosure']))$this->str_item.="   <enclosure>".$item['enclosure']."</enclosure>\n";
//描述该附带的媒体对象(可选)
  
if(isset($item['category']))$this->str_item.="   <category>".$item['category']."</category>\n";
//包含该项的一个或几个分类(catogory)(可选)
  
if(isset($item['pubdate']))$this->str_item.="   <pubDate>".$item['pubdate']."</pubDate>\n";
//项的发布时间(可选)
  
if(isset($item['source_url']))$this->str_item.="   <source url=\"".$item['source_url']."\">".$item['source_name']."</source>\n";
//该项来自的RSS道(可选)
  
$this->str_item.="  </item>\n"
;
}
/*输出xml*/
function generate
()
{
  if(isset(
$this->channel_pre)&&isset($this->channel_end)&&isset($this->str_item
))
  {
   
Header("Content-type:text/xml"
);
   echo 
$this->channel_pre
;
   echo 
$this->str_image
;
   echo 
$this->str_item
;
   echo 
$this->channel_end
;
  }
}
/*擦除频道*/
function erase_channel
()
{
  unset(
$this->channel_pre
);
  unset(
$this->channel_end
);
}
/*擦除频道图片*/
function erase_image
()
{
  unset(
$this->str_image
);
}
/*擦除项目*/
function erase_item
()
{
  unset(
$this->str_item
);
}
/*擦除所有*/
function erase
()
{
  
$this->erase_channel
();
  
$this->erase_image
();
  
$this->erase_item
();
}
}
?>

今天听同事说要用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);

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代表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没有例外事件,它定义了如下七个可能事件:

[!--infotagslink--]

相关文章

  • php读取zip文件(删除文件,提取文件,增加文件)实例

    下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
  • Jupyter Notebook读取csv文件出现的问题及解决

    这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Photoshop打开PSD文件空白怎么解决

    有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 解决python 使用openpyxl读写大文件的坑

    这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
  • C#实现HTTP下载文件的方法

    这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • SpringBoot实现excel文件生成和下载

    这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
  • php把读取xml 文档并转换成json数据代码

    在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • C#使用StreamWriter写入文件的方法

    这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
  • php批量替换内容或指定目录下所有文件内容

    要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
  • PHP文件上传一些小收获

    又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
  • AI源文件转photoshop图像变模糊问题解决教程

    今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
  • C++万能库头文件在vs中的安装步骤(图文)

    这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • C#路径,文件,目录及IO常见操作汇总

    这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • php文件上传你必须知道的几点

    本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
  • ant design中upload组件上传大文件,显示进度条进度的实例

    这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29
  • php实现文件下载实例分享

    举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07