搜索
系统检测到您的用户名不符合规范:

ThinkPHP XML格式转换成数组

浏览:9187 发布日期:2013年11月12日 分类:功能实现 关键字: XML 格式转换 数组
xml格式转换成数组 用递归操作很简单,大家可以下载附件测试
// Xml 转 数组, 包括根键,忽略空元素和属性,尚有重大错误
public function xml_to_array( $xml )
{
$reg = "/<(\\w+)[^>]*?>([\\x00-\\xFF]*?)<\\/\1円>/";
if(preg_match_all($reg, $xml, $matches))
{
$count = count($matches[0]);
$arr = array();
for($i = 0; $i < $count; $i++)
{
$key = $matches[1][$i];
$val = $this->xml_to_array( $matches[2][$i] ); // 递归
if(array_key_exists($key, $arr))
{
if(is_array($arr[$key]))
{
if(!array_key_exists(0,$arr[$key]))
{
$arr[$key] = array($arr[$key]);
}
}else{
$arr[$key] = array($arr[$key]);
}
$arr[$key][] = $val;
}else{
$arr[$key] = $val;
}
}
return $arr;
}else{
return $xml;
}
}


// Xml 转 数组, 不包括根键
public function xmltoarray( $xml )
{

$arr = $this->xml_to_array($xml);
$key = array_keys($arr);
return $arr[$key[0]];
}
第二种方法,预防递归溢出class XML
{

public $parser = NULL;
public $document = NULL;
public $parent = NULL;
public $stack = NULL;
public $last_opened_tag = NULL;

public 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" );
}

public function destruct( )
{
xml_parser_free( $this->parser );
}

public function &parse( &$data )
{
$this->document = array( );
$this->stack = array( );
$this->parent =& $this->document;
$parsedata = xml_parse( $this->parser, $data, true ) ? $this->document : NULL;
return $parsedata;
}

public function open( &$parser, $tag, $attributes )
{
$this->data = "";
$this->last_opened_tag = $tag;
if ( is_array( $this->parent ) && array_key_exists( $tag, $this->parent ) )
{
if ( is_array( $this->parent[$tag] ) && array_key_exists( 0, $this->parent[$tag] ) )
{
$key = count_numeric_items( $this->parent[$tag] );
}
else
{
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;
}

public function data( &$parser, $data )
{
if ( $this->last_opened_tag != NULL )
{
$this->data .= $data;
}
}

public 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 &XML_unserialize( &$xml )
{
$xml_parser = new XML( );
$data =& $xml_parser->parse( $xml );
$xml_parser->destruct( );
return $data;
}

function &XML_serialize( &$data, $level = 0, $prior_key = NULL )
{
if ( $level == 0 )
{
ob_start( );
echo "<?xml version=\"1.0\" ?>";
echo "\n";
}
while ( list( $key, $value ) = each( $data ) )
{
if ( !strpos( $key, " attr" ) )
{
if ( is_array( $value ) && array_key_exists( 0, $value ) )
{
xml_serialize( $value, $level, $key );
}
else
{
$tag = $prior_key ? $prior_key : $key;
echo str_repeat( "\t", $level );
echo "<";
echo $tag;
if ( array_key_exists( "{$key} attr", $data ) )
{
while ( list( $attr_name, $attr_value ) = each( $data["{$key} attr"] ) )
{
echo " ";
echo $attr_name;
echo "=\"";
echo htmlspecialchars( $attr_value );
echo "\"";
}
reset( $data["{$key} attr"] );
}
if ( is_null( $value ) )
{
echo " />\n";
}
else if ( !is_array( $value ) )
{
echo ">";
echo htmlspecialchars( $value );
echo "</{$tag}>\n";
}
else
{
echo ">\n";
echo xml_serialize( $value, $level + 1 );
echo str_repeat( "\t", $level );
echo "</{$tag}>\n";
}
}
}
}
reset( $data );
if ( $level == 0 )
{
$str =& ob_get_contents( );
ob_end_clean( );
return $str;
}
}

function count_numeric_items( &$array )
{
return is_array( $array ) ? count( array_filter( array_keys( $array ), "is_numeric" ) ) : 0;
}

附件 IndexModel.class.zip ( 705 B 下载:182 次 )

评论() 相关
后面还有条评论,
评论支持使用[code][/code]标签添加代码
您需要登录后才可以评论 登录 | 立即注册
收藏
harker
积分:1634 等级:LV3
热点推荐
(追記) (追記ここまで)
最新更新

我们

合作

网站

信息

ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。

AltStyle によって変換されたページ (->オリジナル) /