values = null; $this->error = false; $this->attributes = array(); $this->name = $name; $this->cdata = false; $this->lastchild = -1; $this->lastname = ''; $this->errormessage = ''; } /* Get attribute-value $test->from_xml(''); echo $test->get_attribute('id'); Outputs: 55 */ function get_attribute($attribute) { if (isset($this->attributes[$attribute])) return $this->attributes[$attribute]; else return false; } /* Get value from tag $test->from_xml('value'); echo $test->get_value(); Outputs: value $person->from_xml('Jon'); echo $person->get_value('firstname'); Outputs: Jon */ function get_value($name = '') { if ($name == '') { if (!is_object($this->values[0])) return $this->values[0]; } else { if (is_array($this->values)) { for ($i=0, $valuescount = count($this->values); $i < $valuescount; $i++) { if ( is_object($this->values[$i]) && $this->values[$i]->name == $name && !is_object($this->values[$i]->values[0])) { return $this->values[$i]->values[0]; } } } } return null; } /* Get tag name $xml->from_xml('') echo $xml->get_name(); Outputs: root */ function get_name() { return $this->name; } /* Get child tag $xml->from_xml(''); while ( $test = &$xml->get_child('test') ) { echo 'test'; } Outputs: testtest $xml->from_xml(''); while ( $test = &$xml->get_child() ) { echo $test->get_name(); } Outputs: testtest2 */ function& get_child($name = '') { if (is_array($this->values)) { if ( $this->lastname != $name ) { $this->lastchild = -1; $this->lastname = $name; } $valuescount = count($this->values); do { $this->lastchild++; if (isset($this->values[$this->lastchild]) && is_object($this->values[$this->lastchild]) && ($this->values[$this->lastchild]->name == $name xor $name == '')) return ( $this->values[$this->lastchild] ); } while ($this->lastchild < $valuescount - 1); } $null = null; return $null; } /* Get first child tag with a given attribute/value-combination $test->from_xml('Jon HelgeStensrud'); $ln =& $test->get_child_byattribute('element', 'name', 'lastname'); echo $ln->get_value(); Outputs: Stensrud */ function& get_child_byattribute($tag, $attribute, $value) { for ( $i=0,$c=count($this->values); $i<$c; $i++ ) { if ( is_object($this->values[$i]) ) { if ( $this->values[$i]->get_name() == $tag ) { $v = $this->values[$i]->get_attribute($attribute); if ( $v == $value ) { return $this->values[$i]; } } } } return $null = null; } /* Reset child-pointer, making get_child() start from top */ function reset_child() { $this->lastchild = -1; $this->lastname = null; } /* Get CDATA */ function get_cdata() { for ( $i=0, $c=count($this->values); $i<$c; $i++) { if ( is_object($this->values[$i]) ) { if ( $this->values[$i]->is_cdata() ) { return $this->values[$i]->get_value(); } } } return ''; } /* Check if a tag is a CDATA-tag. */ function is_cdata() { return $this->cdata; } /* Check for errors (from parsing) */ function get_error() { return $this->error; } /* Get errormessage (from parsing) */ function get_errormessage() { return $this->errormessage; } /* Get the number of values/tags in a tag */ function values_count() { if (!is_array($this->values)) return 0; else return count($this->values); } /* Parse XML into object-structure $xml = &new KQXmlobj(); $xml->from_xml(''); echo $xml->get_name().';'; $tag = &$xml->get_child('tag'); echo $tag->get_name(); Outputs: xml;tag */ function from_xml($xml, $strip = false) { if ( $strip === true ) $xml = stripcslashes($xml); $enc = 'iso-8859-1'; $startpos = strpos($xml, 'error = true; $this->errormessage = 'Unsupported encoding, '.$enc; return ''; break; } $parser = xml_parser_create($enc); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, 'iso-8859-1'); xml_parse_into_struct($parser, $xml, $vals, $index); $errcode = xml_get_error_code($parser); xml_parser_free($parser); if ( $errcode > 0 ) { switch ( $errcode ) { case XML_ERROR_NO_MEMORY: $this->error = true; $this->errormessage = 'No memory'; break; case XML_ERROR_SYNTAX: $this->error = true; $this->errormessage = 'Syntax error'; break; case XML_ERROR_NO_ELEMENTS: $this->error = true; $this->errormessage = 'No elements'; break; case XML_ERROR_INVALID_TOKEN: $this->error = true; $this->errormessage = 'Invalid token'; break; case XML_ERROR_UNCLOSED_TOKEN: $this->error = true; $this->errormessage = 'Unclosed token'; break; case XML_ERROR_PARTIAL_CHAR: $this->error = true; $this->errormessage = 'Partial char'; break; case XML_ERROR_TAG_MISMATCH: $this->error = true; $this->errormessage = 'Tag mismatch'; break; case XML_ERROR_DUPLICATE_ATTRIBUTE: $this->error = true; $this->errormessage = 'Duplicate attribute'; break; case XML_ERROR_JUNK_AFTER_DOC_ELEMENT: $this->error = true; $this->errormessage = 'Junk after DOC element'; break; case XML_ERROR_PARAM_ENTITY_REF: $this->error = true; $this->errormessage = 'Param entity ref'; break; case XML_ERROR_UNDEFINED_ENTITY: $this->error = true; $this->errormessage = 'Undefined entity'; break; case XML_ERROR_RECURSIVE_ENTITY_REF: $this->error = true; $this->errormessage = 'Recursive entity ref'; break; case XML_ERROR_ASYNC_ENTITY: $this->error = true; $this->errormessage = 'Async entity'; break; case XML_ERROR_BAD_CHAR_REF: $this->error = true; $this->errormessage = 'Bad char ref'; break; case XML_ERROR_BINARY_ENTITY_REF: $this->error = true; $this->errormessage = 'Binary entity ref'; break; case XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF: $this->error = true; $this->errormessage = 'Attribute external entity ref'; break; case XML_ERROR_MISPLACED_XML_PI: $this->error = true; $this->errormessage = 'Misplaced xml pi'; break; case XML_ERROR_UNKNOWN_ENCODING: $this->error = true; $this->errormessage = 'Unknown encoding'; break; case XML_ERROR_INCORRECT_ENCODING: $this->error = true; $this->errormessage = 'Incorrect encoding'; break; case XML_ERROR_UNCLOSED_CDATA_SECTION: $this->error = true; $this->errormessage = 'Unclosed cdata section'; break; case XML_ERROR_EXTERNAL_ENTITY_HANDLING: $this->error = true; $this->errormessage = 'External entity handling'; break; } return ''; } $stack = array(); $stack[] = &$this; $stackcount = 1; for ( $i=0, $c=count($vals); $i<$c; $i++) { switch ( $type = $vals[$i]['type'] ) { case 'open': case 'complete': if ( $i == 0 ) { $obj = &$this; $this->name = $vals[$i]['tag']; } else { $obj = &$stack[$stackcount-1]->__insert($vals[$i]['tag']); if ( $type == 'open') $stack[$stackcount++] = &$obj; } if ( isset($vals[$i]['attributes']) ) { foreach ( $vals[$i]['attributes'] as $key => $value ) $obj->attributes[$key] = $value; } if ( isset($vals[$i]['value']) ) $obj->__text($vals[$i]['value']); break; case 'cdata': $stack[$stackcount-1]->__insert_cdata($vals[$i]['value']); break; case 'close': array_pop($stack); $stackcount--; break; } } } function __text($text) { if (!is_array($this->values)) { $this->values = array(); } $this->values[] = (string) $text; } function& __insert($name, $value = null) { if (!is_array($this->values)) { $this->values = array(); } if ( is_object($name) ) { $obj = &$this->__obj_insert($name); return $obj; } else { $new = &new KQXmlobj(); $new->name = $name; if ($value !== null && $value !== false ) $new->values[0] = (string) $value; $this->values[] = &$new; return $new; } } function& __obj_insert(&$obj) { if (!is_array($this->values)) { $this->values = array(); } $valuescount = count($this->values); $this->values[$valuescount] = &$obj; return $this->values[$valuescount]; } function __insert_cdata($text) { if (!is_array($this->values)) $this->values = array(); $new = &new KQXmlobj(); $new->name = '[CDATA]'; $new->values[0] = $text; $new->cdata = true; $this->values[] = &$new; } } ?>