电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 在线教程-> PHP
2-PHP教程,XML应用
作者:网友供稿 点击:13
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 
    {
        $this->doxmlstring2xml($string,$xpath);
    }

    /**
    * adds an additional pear::db_result resultset to $this->xmldoc
    *
    * @param    object db_result result from a db-query
    * @see      dosql2xml()
    * @access   public
    */
    function addresult($result)
    {
        $this->dosql2xml($result);
    }

    /**
    * adds an aditional resultset generated from an sql-statement
    *  to $this->xmldoc
    *
    * @param    string sql a string containing an sql-statement.
    * @access   public
    * @see      dosql2xml()
    */
    function addsql($sql)
    {
        /* if there are {} expressions in the sql query, we assume its an xpath expression to
        *   be evaluated.
        */

        if (preg_match_all ("/\{([^\}]+)\}/i",$sql,$matches))
        {
            foreach ($matches[1] as $match)
            {
                $sql = preg_replace("#\{".preg_quote($match)."\}#  ", $this->getxpathvalue($match),$sql);
            }
        }
        $result = $this->db->query($sql);

        //very strange
        if (pear::iserror($result->result)) {
                 print "you have an sql-error:<br>".$result->result->userinfo;
                 print "<br>";
                new db_error($result->result->code,pear_error_die);
        }

        $this->dosql2xml($result);
    }

    /**
    * adds an aditional resultset generated from an array
    *  to $this->xmldoc
    * todo: more explanation, how arrays are transferred
    *
    * @param    array multidimensional array.
    * @access   public
    * @see      doarray2xml()
    */
    function addarray ($array)
    {
        $parent_row = $this->insertnewresult(&$metadata);
        $this->doarray2xml($array,$parent_row);
    }

    /**
    * returns an xml-string with a xml-representation of the resultsets.
    *
    * the resultset can be directly provided here, or if you need more than one
    * in your xml, then you have to provide each of them with add() before you
    * call getxml, but the last one can also be provided here.
    *
    * @param    mixed  $result result object from a db-query
    * @return   string  xml
    * @access   public
    */
    function getxml($result = null)
    {
        $xmldoc = $this->getxmlobject($result);
        return $xmldoc->dumpmem();
    }

    /**
    * returns an xml domdocument object with a xml-representation of the resultsets.
    *
    * the resultset can be directly provided here, or if you need more than one
    * in your xml, then you have to provide each of them with add() before you
    * call getxmlobject, but the last one can also be provided here.
    *
    * @param    mixed $result result object from a db-query
    * @return   object domdocument
    * @access   public
    */
    function getxmlobject($result = null)
    {
        if ($result) {
            $this->add ($result);
        }
        return $this->xmldoc;
    }

    /**
    * for adding db_result-"trees" to $this->xmldoc
    * @param    object db_result
    * @access   private
    * @see      addresult(),addsql()
    */
    function dosql2xml($result)
    {

        if (db::iserror($result)) {
            print "error in file ".__file__." at line ".__line__."<br>\n";
            print $result->userinfo."<br>\n";
            new db_error($result->code,pear_error_die);
        }

        // the method_exists is here, cause tableinfo is only in the cvs at the moment
        // be careful: if you have fields with the same name in different tables, you will get errors
        // later, since db_fetchmode_assoc doesnt differentiate that stuff.
        $this->lastresult = &$result;

        if (!method_exists($result,"tableinfo") || ! ($tableinfo = $result->tableinfo(false)))
        {
            //emulate tableinfo. this can go away, if every db supports tableinfo
            $fetchmode = db_fetchmode_assoc;
            $res = $result->fetchrow($fetchmode);
            $this->nested = false;
            $i = 0;

            while (list($key, $val) = each($res))
            {
                $tableinfo[$i]["table"]= $this->tagnameresult;
                $tableinfo[$i]["name"] = $key;
                $resfirstrow[$i] = $val;
                $i++;
            }
            $res  = $resfirstrow;
            $firstfetchdone = true;
            $fetchmode = db_fetchmode_ordered;
        }
        else
        {
            $firstfetchdone = false;
            $fetchmode = db_fetchmode_ordered;
        }

        // initialize db hierarchy...
        $parenttable = "root";
        $tableinfo["parent_key"]["root"] = 0;

        foreach ($tableinfo as $key => $value)
        {
            if (is_int($key))
            {
                // if the sql-query had a function the table starts with a # (only in mysql i think....), then give the field the name of the table before...
                if (preg_match ("/^#/",$value["table"]) || strlen($value["table"]) == 0) {
                     $value["table"] = $tableinfo[($key - 1)]["table"] ;
                    $tableinfo[$key]["table"] = $value["table"];
                }


                if (!isset($tableinfo["parent_table"]) || is_null($tableinfo["parent_table"][$value]["table"]]))
                {
                    $tableinfo["parent_key"][$value]["table"]] = $key;
                    $tableinfo["parent_table"][$value]["table"]] = $parenttable;
                    $parenttable = $value["table"] ;
                }

            }
            //if you need more tableinfo for later use you can write a function addtableinfo..
            $this->addtableinfo($key, $value, &$tableinfo);
        }

        // end initialize

        // if user made some own tableinfo data, merge them here.
        if ($this->user_tableinfo)
        {
            $tableinfo = $this->array_merge_clobber($tableinfo,$this->user_tableinfo);
        }
        $parent[root] = $this->insertnewresult(&$tableinfo);

        //initialize $resold to get rid of warning messages;
        $resold[0] = "thisvalueisimpossibleforthefirstfieldinthefirstrow";

        while ($firstfetchdone == true || $res = $result->fetchrow($fetchmode))
        {

            //firstfetchdone is only for emulating tableinfo, as long as not all dbs support tableinfo. can go away later
            $firstfetchdone = false;

            while (list($key, $val) = each($res))
            {

                if ($resold[$tableinfo]["parent_key"][$tableinfo][$key]["table"]]] != $res[$tableinfo]["parent_key"][$tableinfo][$key]["table"]]] || !$this->nested)
                {
                    if ($tableinfo["parent_key"][$tableinfo][$key]["table"]] == $key )
                    {
                        if ($this->nested || $key == 0)
                        {

                            $parent[$tableinfo][$key]["table"]] =  $this->insertnewrow($parent[$tableinfo]["parent_table"][$tableinfo][$key]["table"]]], $res, $key, &$tableinfo);
                        }
                        else
                        {
                            $parent[$tableinfo][$key]["table"]]= $parent[$tableinfo]["parent_table"][$tableinfo][$key]["table"]]];
                        }

                        //set all children entries to somethin stupid
                        foreach($tableinfo["parent_table"] as $pkey => $pvalue)
                        {
                            if ($pvalue == $tableinfo[$key]["table"])
                            {
                                $resold[$tableinfo]["parent_key"][$pkey]]= "thisisjustaplaceholder";
                            }
                        }

                    }
                    if ( $parent[$tableinfo][$key]["table"]] != null)
                    {
                        $this->insertnewelement($parent[$tableinfo][$key]["table"]], $res, $key, &$tableinfo, &$subrow);
                    }

                }
            }

            $resold = $res;
            unset ($subrow);
        }
        return $this->xmldoc;
    }



    /**
    * for adding whole arrays to $this->xmldoc
    *
    * @param    array
    * @param    object domnode
    * @access   private
    * @see      addarray()
    */

    function doarray2xml ($array, $parent) {

        while (list($key, $val) = each($array))
            {
                $tableinfo[$key]["table"]= $this->tagnameresult;
                $tableinfo[$key]["name"] = $key;
            }

        if ($this->user_tableinfo)
        {
            $tableinfo = $this->array_merge_clobber($tableinfo,$this->user_tableinfo);
        }
        foreach ($array as $key=>$value)
        {
            if (is_array($value) ) {
                if (is_int($key) )
                {
                    $valuenew = array_slice($value,0,1);
                    $keynew = array_keys($valuenew);
                    $keynew = $keynew[0];
                }
                else
                {

                    $valuenew = $value;
                    $keynew = $key;
                }

                $rec2 = $this->insertnewrow($parent, $valuenew, $keynew, &$tableinfo);
                $this->doarray2xml($value,$rec2);
            }
            else {
                $this->insertnewelement($parent, $array, $key, &$tableinfo,&$subrow);
            }
        }

    }



    /**
    * this method sets the options for the class
    *  one can only set variables, which are defined at the top of
    *  of this class.
    *
    * @param    array   options to be passed to the class
    * @param    boolean   if the old suboptions should be deleted
    * @access   public
    * @see      $nested,$user_options,$user_tableinfo
    */

    function setoptions($options,$delete = false) {
    //set options
        if (is_array($options))
        {
            foreach ($options as $option => $value)
            {
               if (isset($this->{$option}))
文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·Windows下的PHP5.0安装配制详解-PHP教程,PHP安装
·PHP在XP下IIS和Apache2服务器上的安装-PHP教程,PHP应用
·最近忙于FTP,好站多多!有好多好东东哦!不敢独享!-PHP教程,PHP基础
·PHP 5.0 Pear安装方法-PHP教程,PHP安装
·PHP开发利器-PRADO 1.6(4)-PHP教程,PHP应用
·Sun Sparc Solaris 2.6 Apache-1.3.12+MySQL-3.23.5+PHP-3.0.15 安装记-PHP教程,PHP应用
·php5学习笔记(转)-PHP教程,PHP应用
·APACHE安装笔记-PHP教程,PHP安装
·PHP.MVC的模板标签系统(四)-PHP教程,PHP应用
·PHP.MVC的模板标签系统(二)-PHP教程,PHP应用

最新文章
·PHP源码-利用 QQWry.Dat 实现 IP 地址高效检索
·Php高手带路--问题汇总解答[2]
·PHPQQ编程(2):取QQ在线状态
·php5手动最简安装方法
·福利彩票幸运号码自动生成器
·PHP开发利器-PRADO 1.6
·在Apache 服务器上启用PHP支持
·Windows2000_pro下安装Apache+PHP4+My
·php文件上传的实现
·PHP开发框架的现状和展望




版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号