Blame | Last modification | View Log | RSS feed
<?php//// +----------------------------------------------------------------------+// | PHP Version 4 |// +----------------------------------------------------------------------+// | Copyright (c) 1997-2002 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license, |// | that is bundled with this package in the file LICENSE, and is |// | available at through the world-wide-web at |// | http://www.php.net/license/2_02.txt. |// | If you did not receive a copy of the PHP license and are unable to |// | obtain it through the world-wide-web, please send a note to |// | license@php.net so we can mail you a copy immediately. |// +----------------------------------------------------------------------+// | Authors: Bernd Römer <berndr@bonn.edu> |// | Sebastian Bergmann <sb@sebastian-bergmann.de> |// | Christian Kühn <ck@chkuehn.de> (escape xml entities) |// +----------------------------------------------------------------------+//// $Id: Node.php,v 1.1 2005-04-18 16:13:31 jpm Exp $///*** PEAR::XML_Tree_Node** @author Bernd Römer <berndr@bonn.edu>* @package XML_Tree* @version 1.0 16-Aug-2001*/class XML_Tree_Node {/*** Attributes of this node** @var array*/var $attributes;/*** Children of this node** @var array*/var $children;/*** Content** @var string*/var $content;/*** Name** @var string*/var $name;/*** Constructor** @param string name* @param string content* @param array attributes*/function XML_Tree_Node($name, $content = '', $attributes = array()) {$this->attributes = $attributes;$this->children = array();$this->set_content($content);$this->name = $name;}/*** Adds a child node to this node.** @param mixed child* @param string content* @param array attributes* @return object reference to new child node*/function &addChild($child, $content = '', $attributes = array()) {$index = sizeof($this->children);if (is_object($child)) {if (strtolower(get_class($child)) == 'xml_tree_node') {$this->children[$index] = $child;}if (strtolower(get_class($child)) == 'xml_tree' && isset($child->root)) {$this->children[$index] = $child->root->get_element();}} else {$this->children[$index] = new XML_Tree_Node($child, $content, $attributes);}return $this->children[$index];}/*** @deprecated*/function &add_child($child, $content = '', $attributes = array()) {return $this->addChild($child, $content, $attributes);}/*** clone node and all its children (recursive)** @return object reference to the clone-node*/function &clone() {$clone=new XML_Tree_Node($this->name,$this->content,$this->attributes);$max_child=count($this->children);for($i=0;$i<$max_child;$i++) {$clone->children[]=$this->children[$i]->clone();}/* for future use....// clone all other vars$temp=get_object_vars($this);foreach($temp as $varname => $value)if (!in_array($varname,array('name','content','attributes','children')))$clone->$varname=$value;*/return($clone);}/*** inserts child ($child) to a specified child-position ($pos)** @return inserted node*/function &insertChild($path,$pos,&$child, $content = '', $attributes = array()) {// direct insert of objects useing array_splice() faild :(array_splice($this->children,$pos,0,'dummy');if (is_object($child)) { // child offered is not instanziated// insert a single nodeif (strtolower(get_class($child)) == 'xml_tree_node') {$this->children[$pos]=&$child;}// insert a tree i.e insert root-elementif (strtolower(get_class($child)) == 'xml_tree' && isset($child->root)) {$this->children[$pos]=$child->root->get_element();}} else { // child offered is not instanziated$this->children[$pos]=new XML_Tree_Node($child, $content, $attributes);}return($this);}/*** @deprecated*/function &insert_child($path,$pos,&$child, $content = '', $attributes = array()) {return $this->insertChild($path,$pos,$child, $content, $attributes);}/*** removes child ($pos)** @param integer pos position of child in children-list** @return removed node*/function &removeChild($pos) {// array_splice() instead of a simple unset() to maintain index-integrityreturn(array_splice($this->children,$pos,1));}/*** @deprecated*/function &remove_child($pos) {return $this->removeChild($pos);}/*** Returns text representation of this node.** @return string xml*/function &get(){static $deep = -1;static $do_ident = true;$deep++;if ($this->name !== null) {$ident = str_repeat(' ', $deep);if ($do_ident) {$out = $ident . '<' . $this->name;} else {$out = '<' . $this->name;}foreach ($this->attributes as $name => $value) {$out .= ' ' . $name . '="' . $value . '"';}$out .= '>' . $this->content;if (sizeof($this->children) > 0) {$out .= "\n";foreach ($this->children as $child) {$out .= $child->get();}} else {$ident = '';}if ($do_ident) {$out .= $ident . '</' . $this->name . ">\n";} else {$out .= '</' . $this->name . '>';}$do_ident = true;} else {$out = $this->content;$do_ident = false;}$deep--;return $out;}/*** Gets an attribute by its name.** @param string name* @return string attribute*/function getAttribute($name) {return $this->attributes[strtolower($name)];}/*** @deprecated*/function get_attribute($name) {return $this->getAttribute($name);}/*** Gets an element by its 'path'.** @param string path* @return object element*/function &getElement($path) {if (sizeof($path) == 0) {return $this;}$next = array_shift($path);return $this->children[$next]->get_element($path);}/*** @deprecated*/function &get_element($path) {return $this->getElement($path);}/*** Sets an attribute.** @param string name* @param string value*/function setAttribute($name, $value = '') {$this->attributes[strtolower($name)] = $value;}/*** @deprecated*/function set_attribute($name, $value = '') {return $this->setAttribute($name, $value);}/*** Unsets an attribute.** @param string name*/function unsetAttribute($name) {unset($this->attributes[strtolower($name)]);}/*** @deprecated*/function unset_attribute($name) {return $this->unsetAttribute($name);}/*****/function setContent(&$content){$this->content = $this->_xml_entities($content);}function set_content(&$content){return $this->setContent($content);}/*** Escape XML entities.** @param string xml* @return string xml* @access private*/function _xml_entities($xml) {$xml = str_replace(array('ü', 'Ü', 'ö','Ö', 'ä', 'Ä','ß'),array('ü', 'Ü', 'ö','Ö', 'ä', 'Ä','ß'),$xml);$xml = preg_replace(array("/\&([a-z\d\#]+)\;/i","/\&/","/\#\|\|([a-z\d\#]+)\|\|\#/i","/([^a-zA-Z\d\s\<\>\&\;\.\:\=\"\-\/\%\?\!\'\(\)\[\]\{\}\$\#\+\,\@_])/e"),array("#||\\1||#","&","&\\1;","'&#'.ord('\\1').';'"),$xml);return $xml;}/*** Print text representation of XML tree.*/function dump() {echo $this->get();}}?>