XML operation class implemented by PHP [XML Library]

高洛峰
Release: 2023-03-04 16:42:01
Original
1604 people have browsed it

The example of this article describes the XML operation class implemented by PHP. Share it with everyone for your reference, the details are as follows:

This is an interface program that requires a lot of analysis and parsing of XML. PHP's xml_parse_into_struct() function cannot directly generate an array that is easy to use, and the SimpleXML extension is only supported in PHP5 , so I browsed the search engine and found a good PHP XML operation class on a foreigner's website.

1. Usage examples:

1. Interpret the XML file into an easy-to-use array:

<?php
include(&#39;xml.php&#39;); //引用PHP XML操作类
$xml = file_get_contents(&#39;data.xml&#39;); //读取XML文件
//$xml = file_get_contents("php://input"); //读取POST过来的输入流
$data=XML_unserialize($xml);
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
print_r($data);
echo &#39;
'; ?>
Copy after login

data.xml file:

<?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>
Copy after login

The corresponding array generated by this XML operation class (Chinese character encoding: UTF-8):

Array
(
 [video] => Array
  (
   [upload] => Array
    (
     [videoid] => 998
     [name] => 回忆未来
     [memo] => def
     [up_userid] => 11317
    )
  )
)
Copy after login

2. Convert the array into an XML file:

<?php
include(&#39;xml.php&#39;);//引用PHP XML操作类
$xml = XML_serialize($data);
?>
Copy after login

2. PHP XML operation class source code:

<?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 &#39;<?xml version="1.0" ?>&#39;,"\n"; }
 while(list($key, $value) = each($data))
  if(!strpos($key, &#39; attr&#39;)) #if it&#39;s not an attribute
   #we don&#39;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),&#39;<&#39;,$tag;
    if(array_key_exists("$key attr", $data)){ #if there&#39;s an attribute for this element
     while(list($attr_name, $attr_value) = each($data["$key attr"]))
      echo &#39; &#39;,$attr_name,&#39;="&#39;,htmlspecialchars($attr_value),&#39;"&#39;;
     reset($data["$key attr"]);
    }
    if(is_null($value)) echo " />\n";
    elseif(!is_array($value)) echo &#39;>&#39;,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&#39;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, &#39;open&#39;,&#39;close&#39;);
  xml_set_character_data_handler(&$this->parser, &#39;data&#39;);
 }
 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 = &#39;&#39;; #stores temporary cdata
  $this->last_opened_tag = $tag;
  if(is_array($this->parent) and array_key_exists($tag,$this->parent)){ #if you&#39;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&#39;ve come across
    $key = count_numeric_items($this->parent[$tag]);
   }else{
    #this is the second instance of $tag that we&#39;ve seen. shift around
    if(array_key_exists("$tag attr",$this->parent)){
     $arr = array(&#39;0 attr&#39;=>&$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&#39;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), &#39;is_numeric&#39;)) : 0;
}
?>
Copy after login

I hope this article will be helpful to everyone in PHP programming.

For more articles related to the XML operation class [XML Library] implemented by PHP, please pay attention to the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template