新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> XML网站展示,XML源代码,XML编程示例。 本版仅接受原创、转贴、网站展示,具体的技术交流请前往各相关版块。
    [返回] 中文XML论坛 - 专业的XML技术讨论区XML.ORG.CN讨论区 - XML技术『 XML源码及示例(仅原创和转载) 』 → 如何将XML文件中的数据传送并保存在关系数据库中(1)[转帖] 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 7068 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 如何将XML文件中的数据传送并保存在关系数据库中(1)[转帖] 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     wuyou125 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(猛啃高等数学)
      文章:16
      积分:124
      门派:XML.ORG.CN
      注册:2006/8/9

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给wuyou125发送一个短消息 把wuyou125加入好友 查看wuyou125的个人资料 搜索wuyou125在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看wuyou125的博客楼主
    发贴心情 如何将XML文件中的数据传送并保存在关系数据库中(1)[转帖]

    【导读】在AJAX、网络服务与纯XML之间存在大量的数据传输。XML确实使数据传输更加方便。虽然这相当不错,不过它完全忽略了一个事实,即最终数据必须存储在某个地方,最可能是在一个关系数据库中。这带来了一个问题:如何将XML文件中的信息存储到关系数据库中呢?

    在AJAX、网络服务与纯XML之间存在大量的数据传输。XML确实使数据传输更加方便。虽然这相当不错,不过它完全忽略了一个事实,即最终数据必须存储在某个地方,最可能是在一个关系数据库中。这带来了一个问题:如何将XML文件中的信息存储到关系数据库中呢?

    理想情况下,这种程序很明显;但事实并非如此。哎!如果我长得像布拉德皮特并拥有比尔盖茨的支票薄就好了。我使它接近完美,我做出如下选择:

    整容手术
    释放我的机器人杀手军队
    哈,错误的选择。再试一次。

    每次插入使用一个单独SQL语句的单纯循环方法。
    建立许多可以立即执行的界定SQL语句的单纯循环方法。
    应用XSL建立SQL的科学方法。
    我会选择哪个方法,介意猜一猜吗?

    对,我肯定会选择第三个方法。所以,让我们了解一下我们将要处理的XML,如列表A所示。没有华而不实,只是必要的概念证据。

    列表A——输入XML文件

    <?xml version="1.0" ?>
    <!-- Edited with the Butterfly XML Editor (http://www.butterflyxml.org) -->
    <root>
    <row>
    <state_id>PA</state_id>
    <state_name>Pennsylvania</state_name>
    </row>
    <row>
    <state_id>NJ</state_id>
    <state_name>New Jersey</state_name>
    </row>
    </root>

    下面,我们查看一下我们建立插入的表格,如表A:

    表A——Tarqet表

    state_id
    VARCHAR2(2)

    state_name
    VARCHAR2(50)

    利用这些信息,我们可以采取两种可能的行动。第一种是建立一个XSL式样表,它模仿第一个方法:“每次插入使用一个单独SQL语句的单纯循环方法”。这个方法具有速度与通用性的优势,毕竟XSL是一个世界通用的标准。

    如列表B所示,这个任务所需的XSL与多数其它XSL类似,只有少数几点不同,下面我来分别指出这些差异:首先,专门针对介质类型的xsl:output元素。在这个式样表中,介质类型设定为text/sql,而非默认的text/xml或常见的text/html。另外一个巨大的差异就是其中包含了in.xsl和sqlApostrophe.xsl,它们用来决定那些元素中与数字相对的文本或日期,并用双引号代替单引号来防止SQL问题。另外,还有用来建立输出的xsl:text和xsl:value-of元素。


    列表B——XSL式样表

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="table"/>
    <xsl:param name="textColumns"/>
    <xsl:param name="dateColumns"/>
    <xsl:includehref="in.xsl"/>
    <xsl:includehref="sqlApostrophe.xsl"/>
    <!--
    Stylesheet:sample.xsl
    Creation Date:October 25, 2006
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this XSL style sheet isto generate multiple SQL insert statements.
    Template:match="/"
    Creation Date:October 25, 2006
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to create the outer sql element and invoke the template forthe individual INSERT statements.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="/">
    <xsl:element name="sql">
    <xsl:apply-templates select="//row"/>
    </xsl:element>
    </xsl:template>
    <!--
    Template:match="row"
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to control the creation of the INSERT statements.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="row">
    <xsl:element name="statement">
    <xsl:value-of select="concat('INSERT INTO ',$table,' (')"/>
    <xsl:apply-templates select="*" mode="name"/>
    <xsl:text>) VALUES (</xsl:text>
    <xsl:apply-templates select="*" mode="value"/>
    <xsl:text>)</xsl:text>
    </xsl:element>
    </xsl:template>
    <!--
    Template:match="*" mode="name"
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to list the column names.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="*" mode="name">
    <xsl:if test="position() != 1">
    <xsl:text>, </xsl:text>
    </xsl:if>
    <xsl:value-of select="name(.)"/>
    </xsl:template>
    <!--
    Template:match="*" mode="value"
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to list the column values.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="*" mode="value">
    <xsl:variable name="text">
    <xsl:call-template name="in">
    <xsl:with-param name="list" select="$textColumns"/>
    <xsl:with-param name="value" select="name(.)"/>
    </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="date">
    <xsl:call-template name="in">
    <xsl:with-param name="list" select="$dateColumns"/>
    <xsl:with-param name="value" select="name(.)"/>
    </xsl:call-template>
    </xsl:variable>
    <xsl:if test="position() != 1">
    <xsl:text>, </xsl:text>
    </xsl:if>
    <xsl:choose>
    <xsl:when test="$text = 'true'">
    <xsl:text>'</xsl:text>
    <xsl:call-template name="sqlApostrophe">
    <xsl:with-param name="string" select="."/>
    </xsl:call-template>
    <xsl:text>'</xsl:text>
    </xsl:when>
    <xsl:when test="$date = 'true'">
    <xsl:value-of select="."/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="."/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:template>
    </xsl:stylesheet>

    当然,这个方法仍然存在问题,我们必须遍历XML文件来逐个执行SQL语句,这是一件我最不喜欢的事情。但是,这个问题有别的解决方法:将单独的语句用逗号分隔开来,建立一个复合SQL语句。


    我不认为我懒惰,相反我认为自己有效率。毕竟这个方法比前一个方法更不易出错。因此只需稍稍做一些改变,主要是转移一些代码,我建立了如列表C所示的XSL式样表。

    列表C——高效XSL样式表

    <?xml version="1.0"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:param name="table"/>
    <xsl:param name="textColumns"/>
    <xsl:param name="dateColumns"/>
    <xsl:includehref="in.xsl"/>
    <xsl:includehref="sqlApostrophe.xsl"/>
    <!--
    Stylesheet:sample.xsl
    Creation Date:October 25, 2006
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this XSL style sheet is to generate multiple SQL insert statements.
    Template:match="/"
    Creation Date:October 25, 2006
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to create the outer sql element and invoke the template for the individual INSERT statements.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="/">
    <xsl:element name="sql">
    <xsl:apply-templates select="//row"/>
    </xsl:element>
    </xsl:template>
    <!--
    Template:match="row"
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template isto control the creation of the INSERT statements.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="row">
    <xsl:value-of select="concat('INSERT INTO ',$table,' (')"/>
    <xsl:apply-templates select="*" mode="name"/>
    <xsl:text>) VALUES (</xsl:text>
    <xsl:apply-templates select="*" mode="value"/>
    <xsl:text>)</xsl:text>
    </xsl:template>
    <!--
    Template:match="*" mode="name"
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to list the column names.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="*" mode="name">
    <xsl:if test="position() != 1">
    <xsl:text>, </xsl:text>
    </xsl:if>
    <xsl:value-of select="name(.)"/>
    </xsl:template>
    <!--
    Template:match="*" mode="value"
    Programmer:Edmond Woychowsky
    Purpose:The purpose of this template is to list the column values.
    Update Date:Programmer:Description:
    -->
    <xsl:template match="*" mode="value">
    <xsl:variable name="text">
    <xsl:call-template name="in">
    <xsl:with-param name="list" select="$textColumns"/>
    <xsl:with-param name="value" select="name(.)"/>
    </xsl:call-template>
    </xsl:variable>
    <xsl:variable name="date">
    <xsl:call-template name="in">
    <xsl:with-param name="list" select="$dateColumns"/>
    <xsl:with-param name="value" select="name(.)"/>
    </xsl:call-template>
    </xsl:variable>
    <xsl:if test="position() != 1">
    <xsl:text>, </xsl:text>
    </xsl:if>
    <xsl:choose>
    <xsl:when test="$text = 'true'">
    <xsl:text>'</xsl:text>
    <xsl:call-template name="sqlApostrophe">
    <xsl:with-param name="string" select="."/>
    </xsl:call-template>
    <xsl:text>'</xsl:text>
    </xsl:when>
    <xsl:when test="$date = 'true'">
    <xsl:value-of select="."/>
    </xsl:when>
    <xsl:otherwise>
    <xsl:value-of select="."/>
    </xsl:otherwise>
    </xsl:choose>
    </xsl:template>
    </xsl:stylesheet>

    结论

    过去几年来,我一直在使用这种,或与它类似的方法,都取得了很好的效果。尽管从SQL角度看,它的执行速度比不上比更常见的建立SQL的字符串串联方法提供更好结果的存储过程。我还想指出的是,我说过我使用这个或与它类似的方法,基本只增加了commit和rollback语句来处理错误。不过,这些修改仅仅是个人尝试和个人偏执行为。


       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/18 13:42:00
     
     cdhyy 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:2
      积分:64
      门派:XML.ORG.CN
      注册:2007/3/28

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给cdhyy发送一个短消息 把cdhyy加入好友 查看cdhyy的个人资料 搜索cdhyy在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看cdhyy的博客2
    发贴心情 
    斑竹能推荐本相关的书吗?
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/3/30 10:51:00
     
     emmali808 美女呀,离线,快来找我吧!
      
      
      等级:大二(研究C++)
      文章:56
      积分:270
      门派:XML.ORG.CN
      注册:2008/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给emmali808发送一个短消息 把emmali808加入好友 查看emmali808的个人资料 搜索emmali808在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看emmali808的博客3
    发贴心情 
    参考参考!
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/3/12 15:06:00
     
     LYF100 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:12
      积分:100
      门派:XML.ORG.CN
      注册:2008/4/4

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给LYF100发送一个短消息 把LYF100加入好友 查看LYF100的个人资料 搜索LYF100在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看LYF100的博客4
    发贴心情 
    bucuo
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/4 20:52:00
     
     hongxingby 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:1
      积分:52
      门派:XML.ORG.CN
      注册:2008/4/10

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给hongxingby发送一个短消息 把hongxingby加入好友 查看hongxingby的个人资料 搜索hongxingby在『 XML源码及示例(仅原创和转载) 』的所有贴子 引用回复这个贴子 回复这个贴子 查看hongxingby的博客5
    发贴心情 
    学习中……

    ----------------------------------------------
    <a href="http://www.shhxmp.com/1/wfb.htm">往复泵</a><a href="http://www.shhxmp.com/1/wsb.htm">卫生泵</a> <a href="http://www.shhxmp.com/1/zxb.htm">自吸泵</a> <a href="http://www.shhxmp.com/1/lxb.htm">离心泵</a>

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/10 14:58:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 XML源码及示例(仅原创和转载) 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/4/29 14:32:32

    本主题贴数5,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    136.719ms