把从SQL中取出的数据转化成XMl格式


Posted in PHP onOctober 09, 2006

使用了php的PEAR和DB
<?php
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      
|// +----------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000, 2001 The PHP Group             
|// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 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: Christian Stocker <chregu@phant.ch>                         
|// +----------------------------------------------------------------------+
//
// $Id: sql2xml.php,v 1.59 2001/11/13 10:54:02 chregu Exp $

/**
* This class takes a PEAR::DB-Result Object, a sql-query-string or an array
*  and returns a xml-representation of it.
*
* TODO
*   -encoding etc, options for header
*   -ERROR CHECKING
*
* Usage example
*
* include_once ("DB.php");
* include_once("XML/sql2xml.php");
* $db = DB::connect("mysql://root@localhost/xmltest");
* $sql2xml = new xml_sql2xml();
* //the next one is only needed, if you need others than the default
* $sql2xml->setEncoding("ISO-8859-1","UTF-8");
* $result = $db->query("select * from bands");
* $xmlstring = $sql2xml->getXML($result);
*
* or
*
* include_once ("DB.php");
* include_once("XML/sql2xml.php");
* $sql2xml = new xml_sql2xml("mysql://root@localhost/xmltest");
* $sql2xml->Add("select * from bands");
* $xmlstring = $sql2xml->getXML();
*
* More documentation and a tutorial/how-to can be found at
*   http://php.chregu.tv/sql2xml
*
* @author   Christian Stocker <chregu@bitflux.ch>
* @version  $Id: sql2xml.php,v 1.59 2001/11/13 10:54:02 chregu Exp $
* @package  XML
*/
class XML_sql2xml {

    /**
    * If joined-tables should be output nested.
    *  Means, if you have joined two or more queries, the later
    *   specified tables will be nested within the result of the former
    *   table.
    *   Works at the moment only with mysql automagically. For other RDBMS
    *   you have to provide your table-relations by hand (see user_tableinfo)
    *
    * @var  boolean
    * @see  $user_tableinfo, doSql2Xml(), doArray2Xml();
    */
    var $nested = True;

    /**
    * Name of the tag element for resultsets
    *
    * @var  string
    * @see  insertNewResult()
    */
    var $tagNameResult = "result";

    /**
    * Name of the tag element for rows
    *
    * @var  string
    * @see  insertNewRow()
    */
    var $tagNameRow = "row";

    /**
    *
    * @var   object PEAR::DB
    * @access private
    */
    var $db = Null;

    /**
    * Options to be used in extended Classes (for example in sql2xml_ext).
    * They are passed with SetOptions as an array (arrary("user_options" = array());
    *  and can then be accessed with $this->user_options["bla"] from your
    *  extended classes for additional features.
    *  This array is not use in this base class, it's only for passing easy parameters
    *  to extended classes.
    *
    * @var      array
    */
    var $user_options = array();

    /**
    * The DomDocument Object to be used in the whole class
    *
    * @var      object  DomDocument
    * @access    private
    */
    var $xmldoc;

    /**
    * The Root of the domxml object
    * I'm not sure, if we need this as a class variable....
    * could be replaced by domxml_root($this->xmldoc);
    *
    * @var      object DomNode
    * @access    private
    */
    var $xmlroot;

    /**
    * This array is used to give the structure of your database to the class.
    *  It's especially useful, if you don't use mysql, since other RDBMS than
    *  mysql are not able at the moment to provide the right information about
    *  your database structure within the query. And if you have more than 2
    *  tables joined in the sql it's also not possible for mysql to find out
    *  your real relations.
    *  The parameters are the same as in fieldInfo from the PEAR::DB and some
    *   additional ones. Here they come:
    *  From PEAR::DB->fieldinfo:
    *
    *    $tableInfo[$i]["table"]    : the table, which field #$i belongs to.
    *           for some rdbms/comples queries and with arrays, it's impossible
    *           to find out to which table the field actually belongs. You can
    *           specify it here more accurate. Or if you want, that one fields
    *           belongs to another table, than it actually says (yes, there's
    *           use for that, see the upcoming tutorial ...)
    *
    *    $tableInfo[$i]["name"]     : the name of field #$i. if you want another
    *           name for the tag, than the query or your array provides, assign
    *           it here.
    *
    *   Additional info
    *     $tableInfo["parent_key"][$table]  : index of the parent key for $table.
    *           this is the field, where the programm looks for changes, if this
    *           field changes, it assumes, that we need a new "rowset" in the
    *           parent table.
    *
    *     $tableInfo["parent_table"][$table]: name of the parent table for $table.
    *
    * @var      array
    * @access    private
    */
    var $user_tableInfo = array();

    /**
    * the encoding type, the input from the db has
    */
    var $encoding_from  = "ISO-8859-1";

    /**
    * the encoding type, the output in the xml should have
    * (note that domxml at the moment only support UTF-8, or at least it looks like)
    */
    var $encoding_to = "gb2312";

    var $tagname = "tagname";

    /**
    * Constructor
    * The Constructor can take a Pear::DB "data source name" (eg.
    *  "mysql://user:passwd@localhost/dbname") and will then connect
    *  to the DB, or a PEAR::DB object link, if you already connected
    *  the db before.
    "  If you provide nothing as $dsn, you only can later add stuff with
    *   a pear::db-resultset or as an array. providing sql-strings will
    *   not work.
    * the $root param is used, if you want to provide another name for your
    *  root-tag than "root". if you give an empty string (""), there will be no
    *  root element created here, but only when you add a resultset/array/sql-string.
    *  And the first tag of this result is used as the root tag.
    *
    * @param  mixed $dsn    PEAR::DB "data source name" or object DB object
    * @param  string $root  the name of the xml-doc root element.
    * @access   public
    */
    function XML_sql2xml ($dsn = Null, $root = "root") {

        // if it's a string, then it must be a dsn-identifier;

        if (is_string($dsn))
        {
            include_once ("DB.php");
            $this->db = DB::Connect($dsn);
            if (DB::isError($this->db))
            {
                print "The given dsn for XML_sql2xml was not valid in file ".__FILE__." at line ".__LINE__."<br>\n";
                return new DB_Error($this->db->code,PEAR_ERROR_DIE);
            }

        }

        elseif (is_object($dsn) && DB::isError($dsn))
        {
            print "The given param for XML_sql2xml was not valid in file ".__FILE__." at line ".__LINE__."<br>\n";
            return new DB_Error($dsn->code,PEAR_ERROR_DIE);
        }

        // if parent class is db_common, then it's already a connected identifier
        elseif (get_parent_class($dsn) == "db_common")
        {
            $this->db = $dsn;
        }

        $this->xmldoc = domxml_new_xmldoc('1.0');

        //oehm, seems not to work, unfortunately.... does anybody know a solution?
        $this->xmldoc->encoding = $this->encoding_to;        

        if ($root) {
            $this->xmlroot = $this->xmldoc->add_root($root);
            //PHP 4.0.6 had $root->name as tagname, check for that here...
            if (!isset($this->xmlroot->{$this->tagname}))
            {
                $this->tagname = "name";
            }
        }

    }

    /**
    * General method for adding new resultsets to the xml-object
    *  Give a sql-query-string, a pear::db_result object or an array as
    *  input parameter, and the method calls the appropriate method for this
    *  input and adds this to $this->xmldoc
    *
    * @param    string sql-string, or object db_result, or array
    * @param    mixed additional parameters for the following functions
    * @access   public
    * @see      addResult(), addSql(), addArray(), addXmlFile()
    */
    function add ($resultset, $params = Null)
    {

        // if string, then it's a query, a xml-file or a xml-string...
        if (is_string($resultset)) {
            if (preg_match("/\.xml$/",$resultset)) {
                $this->AddXmlFile($resultset,$params);
            }
            elseif (preg_match("/.*select.*from.*/i" ,  $resultset)) {
                $this->AddSql($resultset);
            }
            else {
                $this->AddXmlString($resultset);
            }

        }
        // if array, then it's an array...
        elseif (is_array($resultset)) {
            $this->AddArray($resultset);
        }

        if (get_class($resultset) == "db_result") {
            $this->AddResult($resultset);
        }
    }

    /**
    * Adds the content of a xml-file to $this->xmldoc, on the same level
    * as a normal resultset (mostly just below <root>)
    *
    * @param    string filename
    * @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   public
    * @see      doXmlString2Xml()
    */

    function addXmlFile($file,$xpath = Null)
    {
        $fd = fopen( $file, "r" );
        $content = fread( $fd, filesize( $file ) );
        fclose( $fd );
        $this->doXmlString2Xml($content,$xpath);
    }

    /**
    * Adds the content of a xml-string to $this->xmldoc, on the same level
    * as a normal resultset (mostly just below <root>)
    *
    * @param    string xml
    * @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   public
    * @see      doXmlString2Xml()
    */

PHP 相关文章推荐
十天学会php之第十天
Oct 09 PHP
php中文字符截取防乱码
Mar 28 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
Aug 26 PHP
PHP array_push 数组函数
Dec 26 PHP
php调用dll的实例操作动画与代码分享
Aug 14 PHP
php结合curl实现多线程抓取
Jul 09 PHP
Yii列表定义与使用分页方法小结(3种方法)
Jul 15 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
thinkphp整合微信支付代码分享
Nov 24 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
laravel 修改.htaccess文件 重定向public的解决方法
Oct 12 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 PHP
JAVA/JSP学习系列之四
Oct 09 #PHP
JAVA/JSP学习系列之二
Oct 09 #PHP
递归列出所有文件和目录
Oct 09 #PHP
不用iconv库的gb2312与utf-8的互换函数
Oct 09 #PHP
PHP的历史和优缺点
Oct 09 #PHP
新版PHP将向Java靠拢
Oct 09 #PHP
JAVA/JSP学习系列之七
Oct 09 #PHP
You might like
php判断对象是派生自哪个类的方法
2015/06/20 PHP
php中this关键字用法分析
2016/12/07 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
.net,js捕捉文本框回车键事件的小例子(兼容多浏览器)
2013/03/11 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
JQuery 给元素绑定click事件多次执行的解决方法
2014/09/09 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
2015/03/02 Javascript
使用C++为node.js写扩展模块
2015/04/22 Javascript
jQuery实现页面下拉100像素出现悬浮窗口的方法
2016/09/05 Javascript
深入理解javascript中的 “this”
2017/01/17 Javascript
在vue中使用vue-echarts-v3的实例代码
2018/09/13 Javascript
bootstrap与pagehelper实现分页效果
2018/12/29 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
ES6顶层对象、global对象实例分析
2019/06/14 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
vue实现将数据存入vuex中以及从vuex中取出数据
2019/11/08 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Python中比较特别的除法运算和幂运算介绍
2015/04/05 Python
tf.truncated_normal与tf.random_normal的详细用法
2018/03/05 Python
PyQt5实现下载进度条效果
2018/04/19 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
Python实现的微信好友数据分析功能示例
2018/06/21 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
2019/07/01 Python
使用python画社交网络图实例代码
2019/07/10 Python
使用python爬取抖音视频列表信息
2019/07/15 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
Python IDE Pycharm中的快捷键列表用法
2019/08/08 Python
40行Python代码实现天气预报和每日鸡汤推送功能
2020/02/27 Python
PyQT5速成教程之Qt Designer介绍与入门
2020/11/02 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
Farfetch台湾官网:奢侈品牌时尚购物平台
2019/06/17 全球购物
活动策划邀请函
2014/02/06 职场文书
劳动争议和解协议书范本
2014/11/20 职场文书
无违反计划生育证明格式
2015/06/24 职场文书
文艺演出主持词
2015/07/01 职场文书