本文实例讲述了PHP实现的XML操作类。分享给大家供大家参考,具体如下:
这是一个接口程序,需要大量分析解析XML,PHP的xml_parse_into_struct()函数不能直接生成便于使用的数组,而SimpleXML扩展在PHP5中才支持,于是逛逛搜索引擎,在老外的网站上找到了一个不错的PHP XML操作类。
一、用法举例:
1、将XML文件解释成便于使用的数组:
1
2
3
4
5
6
7
8
9
|
<?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文件:
1
2
3
4
5
6
7
8
9
|
<? xml version = "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):
1
2
3
4
5
6
7
8
9
10
11
12
13
|
Array
(
[video] => Array
(
[upload] => Array
(
[videoid] => 998
[name] => 回忆未来
[memo] => def
[up_userid] => 11317
)
)
)
|
2、将数组转换成XML文件:
1
2
3
4
|
<?php
include ( 'xml.php' ); //引用PHP XML操作类
$xml = XML_serialize( $data );
?>
|
二、PHP XML操作类源代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
<?php
###################################################################################
# XML_unserialize: takes raw XML as a parameter (a string)
# and returns an equivalent PHP data structure
###################################################################################
function & XML_unserialize(& $xml ){
$xml_parser = & new XML();
$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 an array .
###################################################################################
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' )) # if it's not an attribute
#we don't treat attributes by themselves, so for an emptyempty element
# that has attributes you still need to set the element to NULL
if ( is_array ( $value ) and array_key_exists (0, $value )){
XML_serialize( $value , $level , $key );
} else {
$tag = $prior_key ? $prior_key : $key ;
echo str_repeat ( "\t" , $level ), '<' , $tag ;
if ( array_key_exists ( "$key attr" , $data )){ # if there's an attribute for this 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" ;
else echo ">\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 ; }
}
###################################################################################
# XML class : utility class to be used with PHP's XML handling functions
###################################################################################
class XML{
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 an array
var $stack ; #a stack of the most recent parent at each nesting level
var $last_opened_tag ; #keeps track of the last tag opened.
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' );
}
function destruct(){ xml_parser_free(& $this ->parser); }
function & parse(& $data ){
$this ->document = array ();
$this ->stack = array ();
$this ->parent = & $this ->document;
return xml_parse(& $this ->parser, & $data , true) ? $this ->document : NULL;
}
function open(& $parser , $tag , $attributes ){
$this ->data = '' ; #stores temporary cdata
$this ->last_opened_tag = $tag ;
if ( is_array ( $this ->parent) and array_key_exists ( $tag , $this ->parent)){ # if you've seen this tag before
if ( is_array ( $this ->parent[ $tag ]) and array_key_exists (0, $this ->parent[ $tag ])){ # if the keys are numeric
#this is the third or later instance of $tag we've come across
$key = count_numeric_items( $this ->parent[ $tag ]);
} else {
#this is the second instance of $tag that 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;
}
function data(& $parser , $data ){
if ( $this ->last_opened_tag != NULL) #you don't need to store whitespace in between tags
$this ->data .= $data ;
}
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 count_numeric_items(& $array ){
return is_array ( $array ) ? count ( array_filter ( array_keys ( $array ), 'is_numeric' )) : 0;
}
?>
|
希望本文所述对大家PHP程序设计有所帮助。