PHP实现的XML操作类【XML Library】


Posted in PHP onDecember 29, 2016

本文实例讲述了PHP实现的XML操作类。分享给大家供大家参考,具体如下:

这是一个接口程序,需要大量分析解析XML,PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组,而SimpleXML扩展在PHP5中才支持,于是逛逛搜索引擎,在老外的网站上找到了一个不错的PHP XML操作类。

一、用法举例:

1、将XML文件解释成便于使用的数组:

<?php
include('xml.php'); //引用PHP XML操作类
$xml = file_get_contents('data.xml'); //读取XML文件
//$xml = file_get_contents("php://input"); //读取POST过来的输入流
$data=XML_unserialize($xml);
echo '<pre>';
print_r($data);
echo '</pre>';
?>

data.xml文件:

<?xml version="1.0" encoding="GBK"?>
<video>
<upload>
<videoid>998</videoid>
<name><![CDATA[回忆未来]]></name>
<memo><![CDATA[def]]></memo>
<up_userid>11317</up_userid>
</upload>
</video>

利用该XML操作类生成的对应数组(汉字编码:UTF-8):

Array
(
 [video] => Array
  (
   [upload] => Array
    (
     [videoid] => 998
     [name] => 回忆未来
     [memo] => def
     [up_userid] => 11317
    )
  )
)

2、将数组转换成XML文件:

<?php
include('xml.php');//引用PHP XML操作类
$xml = XML_serialize($data);
?>

二、PHP XML操作类源代码:

<?php
###################################################################################
# XML_unserialize: takes raw XML as a parameter (a string)
# and returns an equivalent PHP data structure
###################################################################################
function & XML_unserialize(&$xml){
 $xml_parser = &new XML();
 $data = &$xml_parser->parse($xml);
 $xml_parser->destruct();
 return $data;
}
###################################################################################
# XML_serialize: serializes any PHP data structure into XML
# Takes one parameter: the data to serialize. Must be an array.
###################################################################################
function & XML_serialize(&$data, $level = 0, $prior_key = NULL){
 if($level == 0){ ob_start(); echo '<?xml version="1.0" ?>',"\n"; }
 while(list($key, $value) = each($data))
  if(!strpos($key, ' attr')) #if it's not an attribute
   #we don't treat attributes by themselves, so for an emptyempty element
   # that has attributes you still need to set the element to NULL
   if(is_array($value) and array_key_exists(0, $value)){
    XML_serialize($value, $level, $key);
   }else{
    $tag = $prior_key ? $prior_key : $key;
    echo str_repeat("\t", $level),'<',$tag;
    if(array_key_exists("$key attr", $data)){ #if there's an attribute for this element
     while(list($attr_name, $attr_value) = each($data["$key attr"]))
      echo ' ',$attr_name,'="',htmlspecialchars($attr_value),'"';
     reset($data["$key attr"]);
    }
    if(is_null($value)) echo " />\n";
    elseif(!is_array($value)) echo '>',htmlspecialchars($value),"</$tag>\n";
    else echo ">\n",XML_serialize($value, $level+1),str_repeat("\t", $level),"</$tag>\n";
   }
 reset($data);
 if($level == 0){ $str = &ob_get_contents(); ob_end_clean(); return $str; }
}
###################################################################################
# XML class: utility class to be used with PHP's XML handling functions
###################################################################################
class XML{
 var $parser; #a reference to the XML parser
 var $document; #the entire XML structure built up so far
 var $parent; #a pointer to the current parent - the parent will be an array
 var $stack; #a stack of the most recent parent at each nesting level
 var $last_opened_tag; #keeps track of the last tag opened.
 function XML(){
   $this->parser = &xml_parser_create();
  xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);
  xml_set_object(&$this->parser, &$this);
  xml_set_element_handler(&$this->parser, 'open','close');
  xml_set_character_data_handler(&$this->parser, 'data');
 }
 function destruct(){ xml_parser_free(&$this->parser); }
 function & parse(&$data){
  $this->document = array();
  $this->stack = array();
  $this->parent = &$this->document;
  return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL;
 }
 function open(&$parser, $tag, $attributes){
  $this->data = ''; #stores temporary cdata
  $this->last_opened_tag = $tag;
  if(is_array($this->parent) and array_key_exists($tag,$this->parent)){ #if you've seen this tag before
   if(is_array($this->parent[$tag]) and array_key_exists(0,$this->parent[$tag])){ #if the keys are numeric
    #this is the third or later instance of $tag we've come across
    $key = count_numeric_items($this->parent[$tag]);
   }else{
    #this is the second instance of $tag that we've seen. shift around
    if(array_key_exists("$tag attr",$this->parent)){
     $arr = array('0 attr'=>&$this->parent["$tag attr"], &$this->parent[$tag]);
     unset($this->parent["$tag attr"]);
    }else{
     $arr = array(&$this->parent[$tag]);
    }
    $this->parent[$tag] = &$arr;
    $key = 1;
   }
   $this->parent = &$this->parent[$tag];
  }else{
   $key = $tag;
  }
  if($attributes) $this->parent["$key attr"] = $attributes;
  $this->parent = &$this->parent[$key];
  $this->stack[] = &$this->parent;
 }
 function data(&$parser, $data){
  if($this->last_opened_tag != NULL) #you don't need to store whitespace in between tags
   $this->data .= $data;
 }
 function close(&$parser, $tag){
  if($this->last_opened_tag == $tag){
   $this->parent = $this->data;
   $this->last_opened_tag = NULL;
  }
  array_pop($this->stack);
  if($this->stack) $this->parent = &$this->stack[count($this->stack)-1];
 }
}
function count_numeric_items(&$array){
 return is_array($array) ? count(array_filter(array_keys($array), 'is_numeric')) : 0;
}
?>
PHP 相关文章推荐
php array_flip() 删除数组重复元素
Jan 14 PHP
PHP 截取字符串 分别适合GB2312和UTF8编码情况
Feb 12 PHP
phpmyadmin 访问被拒绝的真实原因
Jun 15 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 PHP
PHP中的reflection反射机制测试例子
Aug 05 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
WampServer搭建php环境时遇到的问题汇总
Jul 23 PHP
CI框架集成Smarty的方法分析
May 17 PHP
Yii2.0预定义的别名功能小结
Jul 04 PHP
PHP大文件分割上传 PHP分片上传
Aug 28 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 PHP
php常用字符函数实例小结
Dec 29 #PHP
php常用正则函数实例小结
Dec 29 #PHP
详解ThinkPHP3.2.3验证码显示、刷新、校验
Dec 29 #PHP
php常用数组函数实例小结
Dec 29 #PHP
php正则修正符用法实例详解
Dec 29 #PHP
PHP登录(ajax提交数据和后台校验)实例分享
Dec 29 #PHP
php preg_match的匹配不同国家语言实例
Dec 29 #PHP
You might like
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
我用php+mysql写的留言本
2006/10/09 PHP
PHP中文件上传的一个问题
2010/09/04 PHP
PHP 利用Mail_MimeDecode类提取邮件信息示例
2014/01/26 PHP
php 魔术方法详解
2014/11/11 PHP
php中通过DirectoryIterator删除整个目录的方法
2015/03/13 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
简单三步,搞掂内存泄漏
2007/03/10 Javascript
让JavaScript拥有类似Lambda表达式编程能力的方法
2010/09/12 Javascript
简单的js表单验证函数
2013/10/28 Javascript
引用外部脚本时script标签关闭的写法
2014/01/20 Javascript
jQuery中Dom的基本操作小结
2014/01/23 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
jquery获取复选框的值的简单实例
2016/05/26 Javascript
jquery插件uploadify多图上传功能实现代码
2016/08/12 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
nodejs和react实现即时通讯简易聊天室功能
2019/08/21 NodeJs
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
详解Vue串联过滤器的使用场景
2020/04/30 Javascript
详解javascript void(0)
2020/07/13 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
pytorch中 gpu与gpu、gpu与cpu 在load时相互转化操作
2020/05/25 Python
基于python实现生成指定大小txt文档
2020/07/20 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
工程造价与管理专业应届生求职信
2013/11/23 职场文书
财务会计专业求职信范文
2013/12/31 职场文书
趣味体育活动方案
2014/02/08 职场文书
横幅标语大全
2014/06/17 职场文书
国庆促销活动总结
2014/08/29 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
档案管理员岗位职责
2015/02/12 职场文书
英文投诉信格式
2015/07/03 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
收音机爱好者玩机13年,简评其使用过的19台收音机
2022/04/30 无线电