3
author:一佰互联 2019-05-01   click:179
{                    if (is_array($value) && ! $delete)                    {                        foreach ($value as $suboption => $subvalue)                        {                            $this->{$option}["$suboption"] = $subvalue;                        }                    }                    else                    {                          $this->$option = $value;                    }                }            }        }    }    // these are the functions, which are intended to be overriden in user classes    /**    *    * @param    mixed    * @return   object  DomNode    * @access   private    */    function insertNewResult(&$metadata)    {        if ($this->xmlroot)            return $this->xmlroot->new_child($this->tagNameResult, NULL);        else        {            $this->xmlroot = $this->xmldoc->add_root($this->tagNameResult);            //PHP 4.0.6 had $root->name as tagname, check for that here...            if (!isset($this->xmlroot->{$this->tagname}))            {                $this->tagname = "name";            }            return $this->xmlroot;        }    }    /**    *   to be written    *    * @param    object DomNode $parent_row    * @param    mixed $res    * @param    mixed $key    * @param    mixed &metadata    * @return   object DomNode    * @access private    */    function insertNewRow($parent_row, $res, $key, &$metadata)    {        return  $parent_row->new_child($this->tagNameRow, Null);    }    /**    *   to be written    *    * @param    object DomNode $parent    * @param    mixed $res    * @param    mixed $key    * @param    mixed &$metadata    * @param    mixed &$subrow    * @return   object DomNode    * @access private    */    function insertNewElement($parent, $res, $key, &$metadata, &$subrow)    {        return  $parent->new_child($metadata[$key]["name"], $this->xml_encode(trim$res[$key]));    }    /**    *   to be written    *    * @param    mixed $key    * @param    mixed $value    * @param    mixed &$metadata    * @access private    */    function addTableInfo($key, $value, &$metadata) {    }    // end functions, which are intended to be overriden in user classes    // here come some helper functions...    /**    * make utf8 out of the input data and escape & with & and "< " with "< "    * (we assume that when there"s no space after < it"s a tag, which we need in the xml)    *  I"m not sure, if this is the standard way, but it works for me.    *    * @param    string text to be utfed.    * @access private    */    function xml_encode ($text)    {        if (function_exists("iconv") && isset($this->encoding_from) && isset($this->encoding_to))        {             ini_set("track_errors",1);             $text = iconv($this->encoding_from,$this->encoding_to,ereg_replace("&","&",ereg_replace("< ","< ",$text)));             if (! isset($text) )             {                if (isset($php_errormsg))                {                    $errormsg = "error: $php_errormsg";                }                else                {                    $errormsg = "undefined iconv error, turn on track_errors in php.ini to get more details";                }                return PEAR::raiseError($errormsg,Null,PEAR_ERROR_DIE);             }             else {                return $text;             }        }        else        {            //$text = utf8_encode(ereg_replace("&","&",ereg_replace("< ","< ",$text)));            $text = trim(ereg_replace("&","&",ereg_replace("< ","< ",$text)));//            echo $text;        }        return $text;    }    //taken from kc@hireability.com at http://www.php.net/manual/en/function.array-merge-recursive.php    /**    * There seemed to be no built in function that would merge two arrays recursively and clobber    *   any existing key/value pairs. Array_Merge() is not recursive, and array_merge_recursive    *   seemed to give unsatisfactory results... it would append duplicate key/values.    *    *   So here"s a cross between array_merge and array_merge_recursive    **/    /**    *    * @param    array first array to be merged    * @param    array second array to be merged    * @return   array merged array    * @access private    */    function array_merge_clobber($a1,$a2)    {        if(!is_array($a1) !is_array($a2)) return false;        $newarray = $a1;        while (list($key, $val) = each($a2))        {            if (is_array($val) && is_array($newarray[$key]))            {                $newarray[$key] = $this->array_merge_clobber($newarray[$key], $val);            }            else            {                $newarray[$key] = $val;            }        }        return $newarray;    }    /**    * Adds a xml string to $this->xmldoc.    * It"s inserted on the same level as a "normal" resultset, means just as a children of <root>    * if a xpath expression is supplied, it takes that for selecting only part of the xml-file    *    * the clean code works only with php 4.0.7    * for php4.0.6 :    * I found no cleaner method than the below one. it"s maybe nasty (xmlObject->string->xmlObject),    *  but it works. If someone knows how to add whole DomNodes to another one, let me know...    *    * @param    string xml string    * @param    mixed xpath  either a string with the xpath expression or an array with "xpath"=>xpath expression  and "root"=tag/subtag/etc, which are the tags to be inserted before the result    * @access private    */    function doXmlString2Xml ($string,$xpath = Null)    {        //check if we have a recent domxml. otherwise use the workaround...        $version = explode(".",phpversion());        if (! ($version[0] <= 4 and $version[1] <= 0 and $version[2] < 7) ){            if (is_array($xpath))            {                if (isset($xpath["root"]))                {                    $root = $xpath["root"];                }                $xpath = $xpath["xpath"];            }            $tmpxml = xmldoc($string);            $subroot = $this->xmlroot;            if (isset($root))            {                $roots = explode("/",$root);                foreach ($roots as $rootelement)                {                    if ( strlen($rootelement) > 0 )                    {                        $subroot = $subroot->new_child($rootelement,"");                    }                }            }            //$this->xmlroot->addchild does some strange things when added nodes from xpath.... so this comment helps out            $newchild = $subroot->add_child($this->xmldoc->create_comment("the purpose of this comment is a workaround in sql2php.php line ".__LINE__));            // if no xpath is given, just take the whole file            if ( (is_null($xpath)))            {                $newchild->append_child($tmpxml->root());            }            else            {                $xctx = $tmpxml->xpath_new_context();                $xnode = xpath_eval($xctx,$xpath);                foreach ($xnode->nodeset as $node)                {                    $newchild->append_child($node);                }            }         }        else {            $MainXmlString = $this->xmldoc->dumpmem();            $string = preg_replace("/<?xml.*?>/","",$string);            $MainXmlString = preg_replace("/<".$this->xmlroot->{$this->tagname}."/>/","<".$this->xmlroot->{$this->tagname}."></".$this->xmlroot->{$this->tagname}.">",$MainXmlString);            $MainXmlString = preg_replace("/</".$this->xmlroot->{$this->tagname}.">/",$string."</".$this->xmlroot->{$this->tagname}.">",$MainXmlString);            $this->xmldoc = xmldoc($MainXmlString);            $this->xmlroot = $this->xmldoc->root();        }    }    /**    * sets the encoding for the db2xml transformation    * @param    string $encoding_from encoding to transform from    * @param    string $encoding_to encoding to transform to    * @access public    */    function setEncoding ($encoding_from = "ISO-8859-1", $encoding_to ="UTF-8")    {        $this->encoding_from = $encoding_from;        $this->encoding_to = $encoding_to;    }    /**    * @param array $parentTables parent to child relation    * @access public    */    function SetParentTables($parentTables)    {        foreach ($parentTables as $table => $parent)        {            $table_info["parent_table"][$table]=$parent;        }        $this->SetOptions(array("user_tableInfo"=>$table_info));    }    /**    * returns the content of the first match of the xpath expression    *    * @param    string $expr xpath expression    * @return   mixed content of the evaluated xpath expression    * @access   public    */    function getXpathValue ($expr)    {        $xpth = $this->xmldoc->xpath_new_context();        $xnode = xpath_eval($xpth,$expr);        if (isset ($xnode->nodeset[0]))        {            $firstnode = $xnode->nodeset[0];            $children = $firstnode->children();            $value = $children[0]->content;                return $value;        }        else        {            return Null;        }    }    /**    * get the values as an array from the childtags from the first match of the xpath expression    *    * @param    string xpath expression    * @return   array with key->value of subtags    * @access   public    */    function getXpathChildValues ($expr)    {        $xpth = $this->xmldoc->xpath_new_context();        $xnode = xpath_eval($xpth,$expr);        if (isset ($xnode->nodeset[0]))        {            foreach ($xnode->nodeset[0]->children() as $child)            {                $children = $child->children();                $value[$child->{$this->tagname}] = $children[0]->content;            }            return $value;        }        else        {            return Null;        }    }}?>