本帖最后由 gotophp 于 2009-7-1 11:24 编辑
- <?php
- /**
- * @copyright 互联网
- * 整理:[url]www.phppx.com[/url]
- * @desc 一个操作xml的PHP类
- */
- /*
- (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.
- -----------
- bugs/me:
- [url]http://www.hansanderson.com/php/[/url]
- [email]me@hansanderson.com[/email]
- [email]showstv@163.com[/email]
- -----------
- Version 1.0
- - 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]nick@wirestation.co.uk[/email]>
- 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 */
- if(isset($this->tagtracker["$curtag"])) {
- $this->tagtracker["$curtag"]++;
- }
- else{
- $this->tagtracker["$curtag"]=0;
- }
- /* if there are attributes for this tag, we set them here. */
- if(count($attrs)>0) {
- $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("attributes",$attrs);
- }
-
- }// end function startElement
- /* 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;
- }
- function xml($data,$identifier="xml") {
- $this->identifier = $identifier;
- // create parser object
- $this->xml_parser = xml_parser_create();
- // 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
- ?>
复制代码 操作方法:- <?php
- require("class.xml.php");
- $file = "data.xml";
- $data = implode("",file($file)) or die("could not open XML input file");
- $obj = new xml($data,"xml");
- print $xml["hans"][0]->num_results[0];
- for($i=0;$i<sizeof($xml["hans"]);$i++) {
- print $xml["hans"][$i]->tag[0] . " ";
- }
- //To print url attributes (if they exist):
- print $xml["hans"][0]->attributes[0]["size"];
- ?>
复制代码 |