<? /* (c) 2000 hans anderson corporation. all rights reserved. you are free to use and modify this class under the same guidelines found in the php license.
- 1.0 is the first actual release of the class. it's finally what i was hoping it would be, though there are likely to still be some bugs in it. this is a much changed version, and if you have downloaded a previous version, this won't work with your existing scripts! you'll need to make some simple changes.
- .92 fixed bug that didn't include tag attributes
(to use attributes, add _attributes[array_index] to the end of the tag in question: $xml_html_head_body_img would become $xml_html_head_body_img_attributes[0], for example)
-- thanks to nick winfield <[email protected]> for reporting this bug.
- .91 no longer requires php4!
- .91 now all elements are array. using objects has been discontinued. */
class xml_container{
function store($k,$v) { $this->{$k}[] = $v; } }
/* parses the information */ /********************************* * 类定义开始 * *********************************/ class xml{
// initialize some variables var $current_tag=array(); var $xml_parser; var $version = 1.0; var $tagtracker = array();
/* here are the xml functions needed by expat */
/* when expat hits an opening tag, it fires up this function */ function startelement($parser, $name, $attrs){
array_push($this->current_tag, $name); // add tag to the cur. tag array $curtag = implode("_",$this->current_tag); // piece together tag
/* this tracks what array index we are on for this tag */
/* when expat hits a closing tag, it fires up this function */ function endelement($parser, $name) { $curtag = implode("_",$this->current_tag); // piece together tag
// before we pop it off, // so we can get the correct // cdata
if(!$this->tagdata["$curtag"]) { $popped = array_pop($this->current_tag); // or else we screw up where we are return; // if we have no data for the tag } else{ $td = $this->tagdata["$curtag"]; unset($this->tagdata["$curtag"]); }
$popped = array_pop($this->current_tag); // we want the tag name for // the tag above this, it // allows us to group the // tags together in a more // intuitive way.
if(sizeof($this->current_tag) == 0) return; // if we aren't in a tag
$curtag = implode("_",$this->current_tag); // piece together tag // this time for the arrays
$j = $this->tagtracker["$curtag"];
if(!$j) $j = 0;
if(!is_object($globals[$this->identifier]["$curtag"][$j])) { $globals[$this->identifier]["$curtag"][$j] = new xml_container; }
$globals[$this->identifier]["$curtag"][$j]->store($name,$td); #$this->tagdata["$curtag"]); unset($td); return true; } // end function endelement
/* when expat finds some internal tag character data, it fires up this function */
function characterdata($parser, $cdata) { $curtag = implode("_",$this->current_tag); // piece together tag $this->tagdata["$curtag"] .= $cdata; }
// set up some options and handlers xml_set_object($this->xml_parser,$this); xml_parser_set_option($this->xml_parser,xml_option_case_folding,0); xml_set_element_handler($this->xml_parser, "startelement", "endelement"); xml_set_character_data_handler($this->xml_parser, "characterdata");
if (!xml_parse($this->xml_parser, $data, true)) { sprintf("xml error: %s at line %d", xml_error_string(xml_get_error_code($this->xml_parser)), xml_get_current_line_number($this->xml_parser)); }
// we are done with the parser, so let's free it xml_parser_free($this->xml_parser);
}//end constructor: function xml()
}//thus, we end our class xml
?>
操作方法:
require('class.xml.php'); $file = "data.xml"; $data = implode("",file($file)) or die("could not open xml input file"); $obj = new xml($data,"xml");