[字号:  ]

发现一个快速将XML文件转化为数组的方法(不用循环,超快速),不知道是否有人想到了

发布时间:2008-10-07 13:21   作者: gameiboy   信息来源: PHPChina 开源社区门户
只需要将序列化的对象数组中'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 编辑 ]

最新回复

wukewei00o at 2008-10-07 13:24:03
分享可贵!
spzgy at 2008-10-07 15:14:20
好像有点意思哦
koin at 2008-10-07 16:43:42
好思路,比我的思想要整整发达10年以上,顶了
gameiboy at 2008-10-07 17:25:20
呵呵,今天做开发的时候无意中发现的规律,挺好用的,以后我的XML解析就用它了
ganshuhan at 2008-10-07 17:42:32
能说下,是怎么转过来的吗,原理是什么
海底人 at 2008-10-07 17:51:24
楼主厉害!
forweike at 2008-10-07 19:49:23
学习学习,谢谢楼主
wbsifan at 2008-10-07 20:58:58
什么原理@!!!!!
imkow at 2008-10-07 21:09:30
还是绕路了。替换序列符号不完全安全,
正常情况应该使用php读取xml的多套库中的一种
异度冰晶 at 2008-10-07 21:12:53
恩 偶尔用用还是不错的
但是真正开发的时候可不能这么用

万一的XML里某个节点带有文本'O:16:"SimpleXMLElement"呢?
ganshuhan at 2008-10-08 09:48:24
就是为什么可以这样转啊,没弄明白,替换成a后,怎么就变成数组了
gokure at 2008-10-12 13:38:14

QUOTE:

原帖由 ganshuhan 于 2008-10-8 09:48 发表
就是为什么可以这样转啊,没弄明白,替换成a后,怎么就变成数组了
看一下 serialize 和 unserialize的用法吧
gokure at 2008-10-12 13:40:04

QUOTE:

原帖由 异度冰晶 于 2008-10-7 21:12 发表
恩 偶尔用用还是不错的
但是真正开发的时候可不能这么用

万一的XML里某个节点带有文本'O:16:"SimpleXMLElement"呢?
应该可以,正确的XML里是不会有这样的内容的
lxylxy888666 at 2008-10-12 13:50:33
不错,呵呵,方便多了。
异度冰晶 at 2008-10-12 14:35:44

QUOTE:

原帖由 gokure 于 2008-10-12 13:40 发表


应该可以,正确的XML里是不会有这样的内容的
这个未必哦
<?xml version="1.0" charset="utf-8">
<node><![CDATA[O:16:"SimpleXMLElement"]]></node>

这是一个正确的XML,但里面就可以存在这个内容
fhjr999 at 2008-10-12 18:02:24

QUOTE:

原帖由 异度冰晶 于 2008-10-12 14:35 发表

这个未必哦



这是一个正确的XML,但里面就可以存在这个内容
这样说比较极端了,很好的方式,不过不知道为什么会不安全。

存储一些我们预先知道形式的数据的时候,完全可以用,毕竟是很方便的方法。

[ 本帖最后由 fhjr999 于 2008-10-12 18:04 编辑 ]
异度冰晶 at 2008-10-13 09:30:34

QUOTE:

原帖由 fhjr999 于 2008-10-12 18:02 发表


这样说比较极端了,很好的方式,不过不知道为什么会不安全。

存储一些我们预先知道形式的数据的时候,完全可以用,毕竟是很方便的方法。
我没说这个方法不能用,但也如你所说,只能用在可预见的数据环境下。
而且也仅能支持元素内的数据,不支持元素的属性。局限性很大
gameiboy at 2008-10-15 17:22:26
看了各位的讨论和回复真是高兴,首先声明一点,这个方法是在我无意中发现的规律,至于能不能扩展思维用于实践,这个我倒确实没想过,不过看大家讨论这么热烈,我在贴一个修改后的出来。

楼上有说转换会遇到本来内容就是替换的内容,这样会出错,我就在想可不可以先将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;
        }
}

最后再说,这个程序不是成熟的程序,只是发现的一个小插曲,希望大家有能从这个上面得到什么启示的,那就好了。
kukat at 2008-10-30 18:20:18
delhtml怎么没有提供?