PHP解析XML

PHP解析XML,如果不复杂的话,用正则简单匹配即可。如果XML比较复杂,就需要仔细思考了。统计了下,方法无非下面几种,排名仅依据喜好。

正则

  这个不多说了。

 

成类或方法 [来源]

  1 <?php
  2 ###################################################################################
  3 #
  4 # XML Library, by Keith Devens, version 1.2b
  5 # <a href="http://keithdevens.com/software/phpxml" target="_blank">http://keithdevens.com/software/phpxml</a>
  6 #
  7 # This code is Open Source, released under terms similar to the Artistic License.
  8 # Read the license at <a href="http://keithdevens.com/software/license" target="_blank">http://keithdevens.com/software/license</a>
  9 #
 10 ###################################################################################
 11 
 12 ###################################################################################
 13 # XML_unserialize: takes raw XML as a parameter (a string)
 14 # and returns an equivalent PHP data structure
 15 ###################################################################################
 16 function & XML_unserialize(&$xml){
 17     $xml_parser = &new XML();
 18     $data = &$xml_parser->parse($xml);
 19     $xml_parser->destruct();
 20     return $data;
 21 }
 22 ###################################################################################
 23 # XML_serialize: serializes any PHP data structure into XML
 24 # Takes one parameter: the data to serialize. Must be an array.
 25 ###################################################################################
 26 function & XML_serialize(&$data, $level = 0, $prior_key = NULL){
 27     if($level == 0){ ob_start(); echo '< xml version="1.0"  >',"\n"; }
 28     while(list($key, $value) = each($data))
 29         if(!strpos($key, ' attr')) #if it's not an attribute
 30             #we don't treat attributes by themselves, so for an empty element
 31             # that has attributes you still need to set the element to NULL
 32 
 33             if(is_array($value) and array_key_exists(0, $value)){
 34                 XML_serialize($value, $level, $key);
 35             }else{
 36                 $tag = $prior_key ? $prior_key : $key;
 37                 echo str_repeat("\t", $level),'<',$tag;
 38                 if(array_key_exists("$key attr", $data)){ #if there's an attribute for this element
 39                     while(list($attr_name, $attr_value) = each($data["$key attr"]))
 40                         echo ' ',$attr_name,'="',htmlspecialchars($attr_value),'"';
 41                     reset($data["$key attr"]);
 42                 }
 43 
 44                 if(is_null($value)) echo " />\n";
 45                 elseif(!is_array($value)) echo '>',htmlspecialchars($value),"</$tag>\n";
 46                 else echo ">\n",XML_serialize($value, $level+1),str_repeat("\t", $level),"</$tag>\n";
 47             }
 48     reset($data);
 49     if($level == 0){ $str = &ob_get_contents(); ob_end_clean(); return $str; }
 50 }
 51 ###################################################################################
 52 # XML class: utility class to be used with PHP's XML handling functions
 53 ###################################################################################
 54 class XML{
 55     var $parser;   #a reference to the XML parser
 56     var $document; #the entire XML structure built up so far
 57     var $parent;   #a pointer to the current parent - the parent will be an array
 58     var $stack;    #a stack of the most recent parent at each nesting level
 59     var $last_opened_tag; #keeps track of the last tag opened.
 60 
 61     function XML(){
 62         $this->parser = &xml_parser_create();
 63         xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, false);
 64         xml_set_object(&$this->parser, &$this);
 65         xml_set_element_handler(&$this->parser, 'open','close');
 66         xml_set_character_data_handler(&$this->parser, 'data');
 67     }
 68     function destruct(){ xml_parser_free(&$this->parser); }
 69     function & parse(&$data){
 70         $this->document = array();
 71         $this->stack    = array();
 72         $this->parent   = &$this->document;
 73         return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL;
 74     }
 75     function open(&$parser, $tag, $attributes){
 76         $this->data = ''; #stores temporary cdata
 77         $this->last_opened_tag = $tag;
 78         if(is_array($this->parent) and array_key_exists($tag,$this->parent)){ #if you've seen this tag before
 79             if(is_array($this->parent[$tag]) and array_key_exists(0,$this->parent[$tag])){ #if the keys are numeric
 80                 #this is the third or later instance of $tag we've come across
 81                 $key = count_numeric_items($this->parent[$tag]);
 82             }else{
 83                 #this is the second instance of $tag that we've seen. shift around
 84                 if(array_key_exists("$tag attr",$this->parent)){
 85                     $arr = array('0 attr'=>&$this->parent["$tag attr"], &$this->parent[$tag]);
 86                     unset($this->parent["$tag attr"]);
 87                 }else{
 88                     $arr = array(&$this->parent[$tag]);
 89                 }
 90                 $this->parent[$tag] = &$arr;
 91                 $key = 1;
 92             }
 93             $this->parent = &$this->parent[$tag];
 94         }else{
 95             $key = $tag;
 96         }
 97         if($attributes) $this->parent["$key attr"] = $attributes;
 98         $this->parent  = &$this->parent[$key];
 99         $this->stack[] = &$this->parent;
100     }
101     function data(&$parser, $data){
102         if($this->last_opened_tag != NULL) #you don't need to store whitespace in between tags
103             $this->data .= $data;
104     }
105     function close(&$parser, $tag){
106         if($this->last_opened_tag == $tag){
107             $this->parent = $this->data;
108             $this->last_opened_tag = NULL;
109         }
110         array_pop($this->stack);
111         if($this->stack) $this->parent = &$this->stack[count($this->stack)-1];
112     }
113 }
114 function count_numeric_items(&$array){
115     return is_array($array) ? count(array_filter(array_keys($array), 'is_numeric')):0;
116 }
117 
118 ?>
View Code

 

SimpleXML

<?php
    $xml = simplexml_load_file("1.xml");
    echo $xml->getName()."<br /><br />";

    foreach($xml->children() as $child) {
        echo $child->getName().": ".$child."<br />";
    }
?>

PHP SimpleXML完整函数

 

DomDocument

1 <?php
2     $dom = new DOMDocument();
3     $dom->load($url);
4  
5     $elements = $dom->getElementsByTagName("xxx");
6     $element = $elements->item(0);
7 ?>

介个操作跟Dom操作差不多。 DOMDocument Class

 

XMLReader

1 <?php
2     $xml = new XMLReader();
3     $xml->open($url);
4 
5     while ($xml->read()) {
6 
7     }
8 ?>

xmlreader 

 

PHP XML Parser

 1 <?php
 2     //无效 xml 文件
 3     $xmlfile = 'test.xml';
 4     $xmlparser = xml_parser_create();
 5 
 6     // 打开文件并读取数据
 7     $fp = fopen($xmlfile, 'r');
 8     $xmldata = fread($fp, 4096);
 9 
10     xml_parse_into_struct($xmlparser,$xmldata,$values);
11 
12     xml_parser_free($xmlparser);
13     print_r($values);
14 ?>
xml_parse_into_struct  PHP XML Parser

 

posted @ 2013-09-05 19:13  fx__xf  阅读(198)  评论(0)    收藏  举报