您现在的位置是:门户> 编程语言> PHP

3
2020-02-25 155人围观 0条评论
简介3

    {
                        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
        * 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("//","",$string);

                $MainXmlString = preg_replace("/<".$this->xmlroot->{$this->tagname}."\/>/","<".$this->xmlroot->{$this->tagname}.">xmlroot->{$this->tagname}.">",$MainXmlString);
                $MainXmlString = preg_replace("/<\/".$this->xmlroot->{$this->tagname}.">/",$string."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;
            }
        }

    }
    ?>
分享:

文章评论

    • wxpython 学习笔记 第一天
    • python文本数据处理学习笔记详解