只需要将序列化的对象数组中'O:16:"SimpleXMLElement"'替换为'a',然后在反序列化就成了,连循环都不用。
只是分享一下自己的经验,不知道是不是有人已经想到了。
class xml2array{
public $str = '';
public $type = 0; //0为字符串,1为文件
function readxml(){
if($this->type==1){
$this->xmlstr = simplexml_load_file($this->str);
}else{
$this->xmlstr = simplexml_load_string($this->str);
}
}
function xarray(){
$this->readxml();
$arrstr = array();
$str = serialize($this->xmlstr);
$str = str_replace('O:16:"SimpleXMLElement"', 'a', $str);
$arrstr = unserialize($str);
return $arrstr;
}
}
再补充一个数组转XML的程序:
class array2xml{
var $xml;
public $topitem = "xmlAll";
public $encode = "utf-8";
function array2xml($array){
$this->xml='<?xml version="1.0" encoding="'.$this->encode.'"?>';
$this->xml.="<".$this->topitem.">";
$this->xml.=$this->_array2xml($array);
}
function getXml(){
return $this->xml.="</".$this->topitem.">";
}
function _array2xml($array){
foreach($array as $key=>$val){
is_numeric($key)&&$key="item id=\"$key\"";
$xml.="<$key>";
$xml.=is_array($val)?$this->_array2xml($val):($val==''?"*Null":delhtml(str_replace('&', '', $val)));
list($key,)=explode(' ',$key);
$xml.="</$key>";
}
return $xml;
}
}
[ 本帖最后由 gameiboy 于 2008-10-7 17:34 编辑 ]
培训新闻
- 北京隆重推出“先就业,后付费”,LAMP就业班...
- 青岛PHPChina培训中心第二期就业寒假班热招
- 唐山PHPChina授权培训中心首期就业班开始热招...
- 广州多迪,零起点,四个月培养高级工程师,包...
- 大连开沅教育(PHP大连中心)12月LAMP项目实...
- 济南第九期LAMP实训就业班冬节火热报名中
- 西安PCTI-5期业余班热招中......
- 上海LAMP一期实战精英班11月27日开班啦~~~~~...
热点专题
网站特别推荐
- LAMP兄弟连最新开班报道
- 北京隆重推出“先就业,后付费”,LAMP就业班...
- 青岛PHPChina培训中心第二期就业寒假班热招
- 唐山PHPChina授权培训中心首期就业班开始热招...
- 广州多迪,零起点,四个月培养高级工程师,包...
- PHP考试认证问题
- 大连开沅教育(PHP大连中心)12月LAMP项目实...
- 福州厦门什么时候有开培训班
- 济南第九期LAMP实训就业班冬节火热报名中
- 西安PCTI-5期业余班热招中......
社区精华
- alee简说OOP插件机制 < 未完待续 >
- mutou_wu我说PHPer的水平区分
- leehui1983MYSQL开发实用知识集合(暂告一段落...
- laruence深入理解PHP原理之文件上传
- peacock【重点推荐】一款专业级Web开发工具






最新回复
正常情况应该使用php读取xml的多套库中的一种
但是真正开发的时候可不能这么用
万一的XML里某个节点带有文本'O:16:"SimpleXMLElement"呢?
QUOTE:
看一下 serialize 和 unserialize的用法吧QUOTE:
应该可以,正确的XML里是不会有这样的内容的QUOTE:
这个未必哦<?xml version="1.0" charset="utf-8">
<node><![CDATA[O:16:"SimpleXMLElement"]]></node>
这是一个正确的XML,但里面就可以存在这个内容
QUOTE:
这样说比较极端了,很好的方式,不过不知道为什么会不安全。存储一些我们预先知道形式的数据的时候,完全可以用,毕竟是很方便的方法。
[ 本帖最后由 fhjr999 于 2008-10-12 18:04 编辑 ]
QUOTE:
我没说这个方法不能用,但也如你所说,只能用在可预见的数据环境下。而且也仅能支持元素内的数据,不支持元素的属性。局限性很大
楼上有说转换会遇到本来内容就是替换的内容,这样会出错,我就在想可不可以先将XML的属性字符串转成特定的字符,首先忽略他自身的关键字,然后再转我们需要的内容,最后再把刚刚转移的特殊字符还原回去。
因为我发现如果是XML元素内的内容字符串,序列化以后,最后关闭的符号是( ; ),而他特定的描述字符最后用的是( : ),所以凭这一点就可以区分出来。
class xml2array{
public $str = '';
public $type = 0; //0为字符串,1为文件
function readxml(){
if($this->type==1){
$this->xmlstr = simplexml_load_file($this->str);
}else{
$this->xmlstr = simplexml_load_string($this->str);
}
}
function xarray(){
$this->readxml();
$arrstr = array();
$str = serialize($this->xmlstr);
$str = str_replace('"O:16:"SimpleXMLElement"";', '*Simple', $str);
$str = str_replace('O:16:"SimpleXMLElement"', 'a', $str);
$str = str_replace('*Simple', '"O:16:"SimpleXMLElement"";', $str);
$arrstr = unserialize($str);
return $arrstr;
}
}
最后再说,这个程序不是成熟的程序,只是发现的一个小插曲,希望大家有能从这个上面得到什么启示的,那就好了。