php实现的XML操作(读取)封装类完整实例
代码如下 | 复制代码 |
<?xmlversion="1.0"encoding="utf-8"standalone="no"?> <CustomizationSettingversion='1.0'> <!-- 各通用配置信息,作为Settings子节点,方便统一解析 --> <!-- AgentSettings 由网页定制生成,默认无次节点--> <AgentSettings> <!-- 以Setting 作为节点名,考虑扩展时,不需修改客户端接口。 type类型方便网页进行显示控件区分 --> <!-- 代理定制类型,默认:Normal。在网页区分语言定制的情况下,以英文、或列表第一种语言的修改为准 --> <Settingname='CustomizeType'type='enum'>Normal|DR</Setting> <!-- 产品名称,AgentType为DR时,用于获取代理购买地址 --> <Settingname='AppName'type='string'>Wondershare Vedio Convertor</Setting> <!-- 品牌名称,AgentType为DR时,用于获取代理购买地址 --> <Settingname='Publisher'type='string'>Wondershare</Setting> <!-- 购买地址生成方式,默认:Customize,由网页生成,默认无次节点 --> <Settingname='OrderPageGenType'type='enum'>Customize|Affiliate</Setting> <!-- Affiliate ID, OrderPageGenType为Affiliate才有效,默认为空值 --> <Settingname='AID'type='string'>143724583</Setting> <!-- 启动Affiliat 购买地址启用短链接, OrderPageGenType为Affiliate才有效,默认:0 --> <Settingname='UseShortAffiliateOrderLink'type='bool'>0|1</Setting> <!-- 定制输出名称 --> <Settingname='OutputFileName'type='string'><![CDATA[1464646.mac-transpod-lite_full879.dmg]]></Setting> </AgentSettings> <!-- 各语言定制信息,作为Languages子节点,方便统一解析, 以及扩展 --> <Languages> <!-- 语言名称,统一使用CBS后台语言数据规范 --> <Languagename='English'> <Settings> <!-- 产品ID,多语言中可被定制 --> <Settingname='PID'type='stirng'>11642</Setting> <!-- 支持弹出广告,默认:1,最终能否弹广告还取决于网站的设置,这里主要用于关闭的总控制 --> <Settingname='EnabelAD'type='bool'>1|0</Setting> <!-- 支持升级,默认:1 --> <Settingname='EnableUpdate'type='bool'>1|0</Setting> <!-- CBS跳转链接类型,只对InstallJumpPage,UninstallJumpPage,RegisterJumpPage,UpdateJumpPage有效,默认:Jump --> <Settingname='CBSJumpType'type='enum'>Jump|Hide|Disable</Setting> <!-- 支持Tisp消息--> <Settingname='TipsEnable'type='bool'>1|0</Setting> <!-- 支持弹出产品目录推荐, 默认:1--> <Settingname='EnableProductSuit'type='bool'>1|0</Setting> </Settings> <!-- 链接地址作为URLS子节点,方便统一解析 --> <URLS> <!-- 不使用'**Page'直接作为节点名称,避免自定义地址的名称与XML节点名称规范冲突,如就数字开头,同时支持网页界面根据不同产品显示链接名称,而且扩展时,而不需修改客户端接口 --> <!-- 购买地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <!-- 区分地址类型order, jump, comm, custom方便网页显示归类 --> <URLname='OrderPage'type='order'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 安装跳转地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='InstallJumpPage'type='jump'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 卸载跳转地址,Mac产品无此项。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='UninstallJumpPage'type='jump'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 注册跳转地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='RegisterJumpPage'type='jump'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 升级跳转地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='UpdateJumpPage'type='jump'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 公司主页地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='HomePage'type='comm'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 产品主页地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='ProductPage'type='comm'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 支持地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='SupportPage'type='comm'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 联系客服地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='ContactPage'type='comm'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 在线帮助地址。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='HelpOnlinePage'type='comm'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 自定义地址,最多可定义5个。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='3DPage'type='custom'updateReserve='0|1'><![CDATA[http://...]]></URL> <!-- 自定义地址,最多可定义5个。属性updateReserve表示产品升级保留定制信息,默认:0, 进入定制页面后,默认修改为1 --> <URLname='GPUPage'type='custom'updateReserve='0|1'><![CDATA[http://...]]></URL> </URLS> <!-- 待扩展信息,在客户端接口中预先处理 --> </Language> <!-- 产品不支持某种语言,则不需要该<Language>节点 --> <Languagename='Traditional Chinese(HK)'> <!-- 同上 --> </Language> <Languagename='Chinese'> <!-- 同上 --> </Language> <Languagename='Portuguese'> <!-- 同上 --> </Language> <Languagename='Japanese'> <!-- 同上 --> </Language> <Languagename='Korean'> <!-- 同上 --> </Language> <Languagename='Hebrew'> <!-- 同上 --> </Language> <Languagename='Arabic'> <!-- 同上 --> </Language> <Languagename='Spanish'> <!-- 同上 --> </Language> <Languagename='Polish'> <!-- 同上 --> </Language> <Languagename='German'> <!-- 同上 --> </Language> <Languagename='French'> <!-- 同上 --> </Language> <Languagename='Italian'> <!-- 同上 --> </Language> <Languagename='Spanish(Spain)'> <!-- 同上 --> </Language> <Languagename='Spanish(Mexico)'> <!-- 同上 --> </Language> <Languagename='Traditional Chinese(TW)'> <!-- 同上 --> </Language> <Languagename='Dutch'> <!-- 同上 --> </Language> <Languagename='Russian'> <!-- 同上 --> </Language> </Languages> </CustomizationSetting> |
封装了下读取xml操作类:
代码如下 | 复制代码 |
<?php /** * xml操作基类 */ classXmlBase { publicfunction__construct() { } /** * 加载xml * @param string $xml xml路径或xml字符串 * @param bool $isXmlStr 是否是xml字符串 */ protectedfunction_loadXml($xml,$isXmlStr= FALSE) { $xmlObj=newDOMDocument(); if($isXmlStr) { $xmlObj->loadXML($xmlNewStr); }else{ $xmlObj->load($xml); } return$xmlObj; } /** * 获取某个标签节点 * @param $parentnode 父节点 * @param $tagName 标签名 // 不区分大小写 * @return node 节点对象 */ protectedfunction_getNode($parentNode,$tagName) { $childNodes=$this->_getNodes($parentNode); foreach($childNodesas$node) { $nodeName=strtolower(trim($node->nodeName)); $tagName=strtolower(trim($tagName)); if($nodeName==$tagName) { return$node; } } returnNULL; } /** * 获取xml子节点 * @param $parentNode 父节点 * @param $tagName 子节点标签 // 不区分大小写 */ protectedfunction_getNodes($parentNode,$tagName='') { $nodes=array(); if($tagName) { $nodes=$this->_getSpecialNodes($parentNode,$tagName); }else{ $nodes=$this->_getAllNodes($parentNode); } return$nodes; } /** * 获取所有的节点 * @param $parentNode 父节点 */ protectedfunction_getAllNodes($parentNode) { $nodes=array(); foreach($parentNode->childNodesas$node) { if($node->nodeType == 1) { $nodes[] =$node; } } return$nodes; } /** * 获取指定标签的节点 * @param $parentNode 父节点 * @param $tagName 节点名称 */ protectedfunction_getSpecialNodes($parentNode,$tagName) { $nodes=array(); $tagName=strtolower(trim($tagName)); foreach($parentNode->childNodesas$node) { $nodeName=strtolower(trim($node->nodeName)); if($node->nodeType == 1 &&$nodeName==$tagName) { $nodes[] =$node; } } return$nodes; } /** * 获取节点属性值 * * @param $node 节点对象 * @param $attrName 节点名字 // 不区分大小写 */ protectedfunction_getAttr($node,$attrName) { $attrName=strtolower($attrName); foreach($node->attributesas$attr) { $nodeName=strtolower($attr->nodeName); //$nodeValue = strtolower($attr->nodeValue); $nodeType=strtolower($attr->nodeType); if($nodeType== 2 &&$nodeName==$attrName) { unset($attrName,$nodeName,$nodeType); return$attr->nodeValue; } } return''; } } ?> |
小编今天推荐的这篇文章介绍了php实现的xml操作类,涉及php针对数组、xml的转换、序列化、反序列化等相关操作技巧,有兴趣的同学可以参考一下
本文实例讲述了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 |
相关文章
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- php语言实现redis的客户端与服务端有一些区别了因为前面介绍过服务端了这里我们来介绍客户端吧,希望文章对各位有帮助。 为了更好的了解redis协议,我们用php来实现...2016-11-25
- 有时我们在页面上需要选择数值范围,如购物时选取价格区间,购买主机时自主选取CPU,内存大小配置等,使用直观的滑块条直接选取想要的数值大小即可,无需手动输入数值,操作简单又方便。HTML首先载入jQuery库文件以及jRange相关...2015-03-15
- 本文实例讲述了JS实现的简洁纵向滑动菜单(滑动门)效果。分享给大家供大家参考,具体如下:这是一款纵向布局的CSS+JavaScript滑动门代码,相当简洁的手法来实现,如果对颜色不满意,你可以试着自己修改CSS代码,这个滑动门将每一...2015-10-21
- 在php中解析xml文档用专门的函数domdocument来处理,把json在php中也有相关的处理函数,我们要把数据xml 数据存到一个数据再用json_encode直接换成json数据就OK了。...2016-11-25
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
- 这篇文章主要介绍了c# 如何对CSV文件操作,帮助大家更好的理解和学习C#,感兴趣的朋友可以了解下...2020-11-03
- 本文主要介绍了python读取和保存mat文件的方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-08-25
- js里面设置DOM节点透明度的函数属性:filter= "alpha(opacity=" + value+ ")"(兼容ie)和opacity=value/100(兼容FF和GG)。 先来看看设置透明度的兼容性代码: 复制代码 代码如下: function setOpacity(ele, opacity) { if (...2014-06-07
- 首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20
- 本文我们需要解决的问题是如何实现Http请求来实现通信,解决Android 2.3 版本以后无法使用Http请求问题,下面请看正文。 Android开发中使用HttpClient来开发Http程序...2016-09-20
- perl CPAN中有一个Tie-File 模块极大方便了对大文件的操作...2020-06-29
使用MSScriptControl 在 C# 中读取json数据的方法
下面小编就为大家带来一篇使用MSScriptControl 在 C# 中读取json数据的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#实现appSettings节点读取与修改的方法,是非常实用的技巧,需要的朋友可以参考下...2020-06-25
- 复制代码 代码如下:call PROCEDURE_split('分享,代码,片段',',');select * from splittable;复制代码 代码如下:drop PROCEDURE if exists procedure_split;CREATE PROCEDURE `procedure_split`( inputstring varc...2014-05-31
- 这篇文章主要介绍了golang文件读取-按指定BUFF大小读取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-22
- 本文主要介绍了Java读取PDF中的表格的方法示例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-10-22