PHP中XML操作类XML Library的实现
本文实例讲述了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文件:
<?xmlversion="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 XMLasa parameter (a string)
#andreturns an equivalent PHP data structure
###################################################################################
function& XML_unserialize(&$xml){
$xml_parser= &newXML();
$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 anarray.
###################################################################################
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')) #ifit's not an attribute
#we don't treat attributes by themselves, soforan emptyempty element
# that has attributes you still need to set the element to NULL
if(is_array($value)andarray_key_exists(0,$value)){
XML_serialize($value,$level,$key);
}else{
$tag=$prior_key?$prior_key:$key;
echostr_repeat("\t",$level),'<',$tag;
if(array_key_exists("$key attr",$data)){ #ifthere's an attributeforthis 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";
elseecho">\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; }
}
###################################################################################
# XMLclass: utilityclassto be used with PHP's XML handling functions
###################################################################################
classXML{
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 anarray
var$stack; #a stack of the most recent parent at each nesting level
var$last_opened_tag; #keeps track of the last tag opened.
functionXML(){
$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');
}
functiondestruct(){ xml_parser_free(&$this->parser); }
function& parse(&$data){
$this->document =array();
$this->stack =array();
$this->parent = &$this->document;
returnxml_parse(&$this->parser, &$data, true) ?$this->document : NULL;
}
functionopen(&$parser,$tag,$attributes){
$this->data =''; #stores temporary cdata
$this->last_opened_tag =$tag;
if(is_array($this->parent)andarray_key_exists($tag,$this->parent)){ #ifyou've seen this tag before
if(is_array($this->parent[$tag])andarray_key_exists(0,$this->parent[$tag])){ #ifthe keys are numeric
#this is the thirdorlater instance of$tagwe've come across
$key= count_numeric_items($this->parent[$tag]);
}else{
#this is the second instance of$tagthat 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;
}
functiondata(&$parser,$data){
if($this->last_opened_tag != NULL) #you don't need to store whitespace in between tags
$this->data .=$data;
}
functionclose(&$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];
}
}
functioncount_numeric_items(&$array){
returnis_array($array) ?count(array_filter(array_keys($array),'is_numeric')) : 0;
}
?>
|
例子
现在有一个uncletoo.xml的配置文件,格式如下:
<h6>Step 1: XML File</h6>
<?xml version='1.0'?>
<moleculedb>
<molecule name='Benzine'>
<symbol>ben</symbol>
<code>A</code>
</molecule>
<molecule name='Water'>
<symbol>h2o</symbol>
<code>K</code>
</molecule>
<molecule name='Parvez'>
<symbol>h2o</symbol>
<code>K</code>
</molecule>
</moleculedb>
1、读XML文件内容,并保存到字符串变量中
下面我们使用PHP自带的file_get_contents()函数将文件内容读取到一个字符串变量中:
$xmlfile = file_get_contents($path);
此时$xmlfile变量的值如下:
2、将字符串转换为对象
这一步我们将使用simplexml_load_string()函数,将上一步得到的字符串转换为对象(Object):
$ob= simplexml_load_string($xmlfile);
此时$ob的值如下:
3、将对象转换为JSON
上一步转换成对象后,现在,我们要将对象转换成JSON格式字符串:
$json = json_encode($ob);
此时$json变量的值如下:
4、解析JSON字符串
这也是最后一步了,我们需要将JSON格式的字符串转换为我们需要的数组:
$configData = json_decode($json, true);
现在$configData里存储的数据就是我么最后要得到的数组,如下:
完整转换代码:
代码如下 | 复制代码 |
|
下面为网上整理的xml转换数组函数
例子一,将XML转成数组
代码如下 | 复制代码 |
如果你使用 curl 获取的 xml data |
例子二,通过遍历
代码如下 | 复制代码 |
// Xml 转 数组, 包括根键 |
例子三
代码如下 | 复制代码 |
function simplexml_obj2array($obj){ |
PHP将数组转换成XML
PHP可以将数组转换成xml格式,简单的办法是遍历数组,然后将数组的key/value转换成xml节点,再直接echo输出了,如:
代码如下 | 复制代码 |
function arrayToXml($arr){ |
我测试了下,这个最简单,速度又快,支持多为数组,中文也不会乱码。
另一种方法是利用DOMDocument来生成xml结构:
代码如下 | 复制代码 |
function arrayToXml($arr,$dom=0,$item=0){ |
它同样可以将数组转换成xml,而且支持多维数组,生成的xml中文也不会乱码。
PHP将XML转换成数组
做接口开发的时候经常会碰到别人提交给你的是xml格式的数据,常见的微信接口、支付宝接口等,他们的接口如发送消息通信都是xml格式的,那么我们先想办法拿到这个xml数据,然后再将其转化成数组。
假设我们获取到一个这样的XML:
代码如下 | 复制代码 |
<root> |
通过simplexml_load_string()解析读取xml数据,然后先转成json格式,再转换成数组。
代码如下 | 复制代码 |
function xmlToArray($xml){ //禁止引用外部xml实体 libxml_disable_entity_loader(true); $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA); $val = json_decode(json_encode($xmlstring),true); return $val; } |
得到数组后,我们就可以对数据进行各种处理了。
下面是网上的
代码如下 | 复制代码 |
class ArrayToXML |
下面是我自己编辑的代码
代码如下 | 复制代码 |
function arrtoxml($arr,$dom=0,$item=0){ |
XML转成数组
代码如下 | 复制代码 |
如果你使用 curl 获取的 xml data |
xml文件结构如下
php代码解析:
$url="";//输出xml的URL $dom = new DOMDocument('1.0', 'utf-8'); $dom->load($url);
这样我们捕获里XML数据,然后一点点截取,这段XML有多个URL节点,需要利DOMPATH解析
$xpath = new DOMXPath($dom); $node = '//url'; $length = $xpath->query($node)->length;
然后根据每个url内的字节点去获取数据
for($i = 0; $i < $length; $i++) { $data = array(); $m_date = date('Y-m-d', strtotime($xpath->query($node.'['.($i+1).']/date')->item(0)->nodeValue)); $m_start = $xpath->query($node.'['.($i+1).']/start')->item(0)->nodeValue; $m_end = $xpath->query($node.'['.($i+1).']/end')->item(0)->nodeValue; $m_title = $xpath->query($node.'['.($i+1).']/title')->item(0)->nodeValue; $m_format = $xpath->query($node.'['.($i+1).']/format')->item(0)->nodeValue; $m_season = $xpath->query($node.'['.($i+1).']/season')->item(0)->nodeValue; $m_round = $xpath->query($node.'['.($i+1).']/round')->item(0)->nodeValue; /*$homeTeam = $xpath->query($node.'['.($i+1).']/homeTeam')->item(0)->nodeValue; if(empty($homeTeam)) continue; $guestTeam = $xpath->query($node.'['.($i+1).']/guestTeam')->item(0)->nodeValue; if(empty($guestTeam)) continue;*/ $homeTeam = $xpath->query($node.'['.($i+1).']/homeTeam')->item(0)->nodeValue; $guestTeam = $xpath->query($node.'['.($i+1).']/guestTeam')->item(0)->nodeValue; if(empty($guestTeam) || empty($homeTeam)) { if($m_title){ $temp_title=explode(" ", $m_title); list($homeTeam,$guestTeam)=explode("vs", $temp_title[1]); unset($temp_title); } } if(empty($homeTeam)) continue; if(empty($guestTeam)) continue; }
相关文章
- 以前我们开发大型项目时都会用到svn来同步,因为开发产品的人过多,所以我们会利用软件来管理,今天发有一居然可以利用php来管理svn哦,好了看看吧。 代码如下 ...2016-11-25
- 操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
c#检测usb设备拨插类库USBClassLibrary分享
这篇文章主要介绍了c#检测usb设备拨插类库USBClassLibrary的简单示例,需要的朋友可以参考下...2020-06-25- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
jQuery+slidereveal实现的面板滑动侧边展出效果
我们借助一款jQuery插件:slidereveal.js,可以使用它控制面板左右侧滑出与隐藏等效果,项目地址:https://github.com/nnattawat/slideReveal。如何使用首先在页面中加载jquery库文件和slidereveal.js插件。复制代码 代码如...2015-03-15- 翻板抽奖的实现流程:前端页面提供6个方块,用数字1-6依次表示6个不同的方块,当抽奖者点击6个方块中的某一块时,方块翻转到背面,显示抽奖中奖信息。看似简单的一个操作过程,却包含着WEB技术的很多知识面,所以本文的读者应该熟...2015-10-21
SQLMAP结合Meterpreter实现注入渗透返回shell
sqlmap 是一个自动SQL 射入工具。它是可胜任执行一个广泛的数据库管理系统后端指印, 检索遥远的DBMS 数据库等,下面我们来看一个学习例子。 自己搭建一个PHP+MYSQ...2016-11-25- 复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; }else if( $da == "2" ){ echo "今天是星期二"; }else if( $da == "3" ){ echo "今天是星期三"; }else if( $da == "4"...2013-10-04
- js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
- 本文我们需要解决的问题是如何实现Http请求来实现通信,解决Android 2.3 版本以后无法使用Http请求问题,下面请看正文。 Android开发中使用HttpClient来开发Http程序...2016-09-20
- 复制代码 代码如下:call PROCEDURE_split('分享,代码,片段',',');select * from splittable;复制代码 代码如下:drop PROCEDURE if exists procedure_split;CREATE PROCEDURE `procedure_split`( inputstring varc...2014-05-31
- 基本思想就是:在JS动态创建select控件的option,通过Ajax获取在PHP从SQL数据库获取的省市区信息,代码有点长,但很多都是类似的,例如JS中省、市、区获取方法类似,PHP中通过参数不同执行不同的select语句。index.html代码:复制...2014-05-31
- 下面代码用JS实现了程序的暂停与继续 复制代码 代码如下: <script type="text/javascript"> /*Javascript中暂停功能的实现 Javascript本身没有暂停功能(sleep不能使用)同时 vbscript也不能使用doEvents,故编写此函数实...2013-10-13
VC++ loadlibrary()加载三方dll失败, 返回错误码:126的解决方法
今天在编写VC++ loadlibrary()加载三方dll是总是失败,并且返回错误码:126,这里就为大家分享一下具体的解决方法...2021-03-15PHP启动提示Unable to load dynamic library php_curl.dll怎么办
PHP启动提示Unable to load dynamic library php_curl.dll怎么办 ,下面我们来看解决办法哦 这个问题容易手配PHP的时候出现, 在php.ini中正确开启了curl扩展后,...2016-11-25- 我们一起来看一篇关于PHPCMS实现自动推送URL到百度站长平台,希望此教程能够帮助到各位朋友。 百度站长平台开放url推送接口,可以使用调用接口的形式主动及时推送u...2016-11-25
Eclipse 和 IDEA 导入library库文件【图文步骤】
关于关于Eclipse 和 IDEA 导入library库文件,本教程使用图文并茂来详情讲解,非常实用,做Android开发的同学可以参考一下。 关于Eclipse 和 IDEA 导入library库文件,...2016-09-20- cover flow效果就一个超级漂亮的图片切换效果了,下面我们来看看CSS+JS实现苹果cover flow效果示例吧,具体的操作步骤细节如下文介绍。 废话不多说, 直接上最终效果...2016-10-02