Maison > Article > développement back-end > Classe d'opération XML implémentée par PHP [Bibliothèque XML]
L'exemple de cet article décrit la classe d'opération XML implémentée par PHP. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :
Il s'agit d'un programme d'interface qui nécessite beaucoup d'analyse et d'analyse XML. La fonction xml_parse_into_struct() de PHP ne peut pas générer directement un tableau facile à générer. utilisation, et l'extension SimpleXML n'est prise en charge qu'en PHP5, j'ai donc parcouru le moteur de recherche et trouvé une bonne classe d'opération PHP XML sur le site Web d'un étranger.
1. Exemples d'utilisation :
1. Interprétez le fichier XML dans un tableau facile à utiliser :
<?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 class="brush:php;toolbar:false">'; print_r($data); echo ''; ?>
fichier data.xml :
<?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>
Le tableau correspondant généré par cette classe d'opération XML (codage des caractères chinois : UTF-8) :
Array ( [video] => Array ( [upload] => Array ( [videoid] => 998 [name] => 回忆未来 [memo] => def [up_userid] => 11317 ) ) )
2. Convertir le tableau en un fichier XML :
<?php include('xml.php');//引用PHP XML操作类 $xml = XML_serialize($data); ?>
2. Code source de la classe d'opération XML PHP :
<?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; } ?>
J'espère que cet article sera utile à tout le monde dans la programmation PHP.
Pour plus d'articles liés à la classe d'opérations XML [Bibliothèque XML] implémentée par PHP, veuillez faire attention au site Web PHP chinois !