如何在MySQL数据库中使用XML数据
来源:asp之家 发布时间:2009-12-29 10:48:00
通过XML使系统之间的数据交换变得更简单,因为它与编程语言无关,刚引入XML的概念时,是通过一个脚本或应用程序解析XML数据,将其转换为适合于数据库和底层系统的有效格式,后来,随着数据库技术的发展,数据库开始支持XML数据,这样就不用转换程序了。今天我将给大家介绍一下MySQL数据库对XML的支持,着重介绍如何导入XML数据到MySQL数据库中,以及如何从MySQL数据库导出XML格式数据。
使用--xml选项将数据导出为XML格式
在MySQL 5.0之前的版本中,使用MySQL命令行客户端以XML格式导出数据时有诸多限制,执行一个命令或查询时使用--xml或-X选项告诉MySQL客户端将结果输出为XML数据,例如,下面的命令将输出所有以version开头的数据库变量。
C:>mysql -u <userid> -p<password> -e "SHOW VARIABLES LIKE '%version%'" –-xml
最终输出的XML包括下面的标准格式:
整个数据集都包括在节点中;
每一行对应一个节点;
所有列包括在一个节点中;
列名出处在name属性中;
列值是一个文本节点。
<?xml version="1.0"?>
<resultset statement="SHOW VARIABLES LIKE '%version%'"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="Variable_name">protocol_version</field>
<field name="Value">10</field>
</row>
<row>
<field name="Variable_name">version</field>
<field name="Value">5.1.30-community</field>
</row>
<row>
<field name="Variable_name">version_comment</field>
<field name="Value">MySQL Community Server (GPL)</field>
</row>
<row>
<field name="Variable_name">version_compile_machine</field>
<field name="Value">ia32</field>
</row>
<row>
<field name="Variable_name">version_compile_os</field>
<field name="Value">Win32</field>
</row>
</resultset>
为了便于对比,下面给出上面的命令表格化输出结果。
+-------------------------+---------------------+
| Variable_name | Value |
+-------------------------+---------------------+
| protocol_version | 10 |
| version | 5.1.22-beta-debug |
| version_comment | Source distribution |
| version_compile_machine | x86_64 |
| version_compile_os | suse-linux-gnu |
+-------------------------+---------------------+
同样的语法可以应用到SELECT语句中,在我以前的一篇文章“借助临时表让你的MySQL查询效率更高”中,最开始的查询中我就用logical_delete_indicator=0的记录填充client_citizenship临时表。
INSERT INTO client_citizenship
SELECT cl.client_id,
cl.date_of_birth,
cl.gender,
cit.citizenship_id,
cit.country_code,
cit.primary_citizenship
FROM temp_table_article.client AS cl,
temp_table_article.citizenship AS cit,
temp_table_article.client_citizenship_rel AS rel
WHERE cl.client_id = rel.client_id
AND cit.citizenship_id = rel.citizenship_id
AND cit.logical_delete_indicator = 0
AND cl.logical_delete_indicator = 0;
在这个临时表上执行“SELECT *”查询返回下面的记录:
client_id, date_of_birth, gender, citizenship_id, country_code, primary_citizenship
2, 1944-01-15, F, 4, 20, 0
2, 1944-01-15, F, 7, 77, 1
当我加上--xml选项后,“SELECT *”查询将返回下面的XML格式结果:
<?xml version="1.0"?>
<resultset statement="SELECT * FROM client_citizenship"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="client_id">2</field>
<field name="date_of_birth">1944-01-15</field>
<field name="gender">F</field>
<field name="citizenship_id">4</field>
<field name="country_code">20</field>
<field name="primary_citizenship">0</field>
</row>
<row>
<field name="client_id">2</field>
<field name="date_of_birth">1944-01-15</field>
<field name="gender">F</field>
<field name="citizenship_id">7</field>
<field name="country_code">77</field>
<field name="primary_citizenship">1</field>
</row>
</resultset>
使用--xml选项的缺点是从关联的数据到XML的映射是固定的,因此无法修改输出。如果你想做某些字符串操作,可以去掉--xml选项,按你自己的方式生成XML代码。
继续沿用前面的查询,我们再来看看如何修改输出的XML,使其符合下面的格式要求:
<client>
<client_id>2</client_id>
<date_of_birth>1944-01-15</date_of_birth>
<gender>F</gender>
<citizenship_id>7</citizenship_id>
<country_code>77</country_code>
<primary_citizenship>1</primary_citizenship>
</client>
其中一个可行的办法是使用CONCAT() 和 GROUP_CONCAT()字符串函数。
mysql>SELECT CONCAT('n<client>n',
->GROUP_CONCAT('<client_id>', client_id, '</client_id>n' SEPARATOR ''),
->GROUP_CONCAT('<date_of_birth>',date_of_birth,'</date_of_birth>n' SEPARATOR ''),
->GROUP_CONCAT('<gender>',gender,'</gender>n' SEPARATOR ''),
->GROUP_CONCAT('<citizenship_id>',citizenship_id,'</citizenship_id>n' SEPARATOR ''),
->GROUP_CONCAT('<country_cd>',country_cd,'</country_cd>n' SEPARATOR ''),
->GROUP_CONCAT('<primary_citizenship>',primary_citizenship,'</primary_citizenship>n' SEPARATOR ''),
->'</client>') AS xmldoc
->FROM client_citizenshipG
虽然我们使用这种变通的方法达到了目标,但这样做还不如使用脚本或编程语言执行格式化,当然这得看你是否熟悉相关脚本或编程语言了。
猜你喜欢
- 那是一杠还是两杠呢?最简单的方式就是拿出钱包,掏出张“新”的50或100,翻到背面的银线上,就会发现两杠的符号。这个是以前跟同事在讨论是一杠
- 1、纯粹的截取字符串function cutstr(thestr1,strlen) dim l,t,c&nbs
- 1. 停应用层的各种程序。 2. 停oralce的监听进程: $lsnrctl stop 3. 在独占的系统用户下,备份控制文件: SQL&
- 本文通过实际业务系统中调整的一个案例,试图给出一个常见CPU消耗问题的一个诊断方法.大多数情况下,系统的性能问题都是由不良SQL代码引起的,
- 春节前在蓝色理想上发了个“雅虎口碑招聘前端工程师 ”的启事,节后收到很多简历,加之HR通过专业招聘网站得到的简历和朋友同事推荐的简历,数量上
- 一. 10句话1.不要依赖register_global=ON的环境,从你刚懂得配置php运行环境甚至尚不明白register_global
- 在讲CSS优先级之前,我们得要了解什么是CSS,CSS是用来做什么的。首先,我们对CSS作一个简单的说明:CSS是层叠样式表(Cascadi
- 在日常的前端开发工作中,我们会经常的与HTML、javascript、css等语言打交道,和一门真正的语言一样,计算机语言也有它的字母表、语
- 在实际的工作和学习中,许多人的SQL Server 2005数据库日志文件可能会发生损坏,例如硬件故障、计算机非正常重启或关机等等。在SQL
- 从毕业实习算起,从事可用性方面的工作到现在已经5年了。在此记录笔者的一些所见所想,和大家讨论分享一下。用户研究在“以用户为中心”的界面设计方
- 如要让数据库进行自动管理,则管理员需要预先定义一些可预测的管理任务以及这些任务发送的条件。当满足这些指定的条件,则数据库会自动运行管理员指定
- 摘 要:本文讨论了Visual Basic应用程序访问SQL Server数据库的几种常用的方法,分别说明了每种方法的内部机理并给出了每种方
- 随着3G的普及,越来越多的人使用手机上网。移动设备正超过桌面设备,成为访问互联网的最常见终端。于是,网页设计师不得不面对一个难题:如何才能在
- 网页开发人员常常希望能够了解并掌握多种语言,结果是,学习一门语言的所有内容是棘手的,但是却很容易发现你并没有完全利用那些比较特殊却很有用的标
- 第一次写ASP类,实现功能:分段统计程序执行时间,输出统计表等.程序代码:Class ccClsProcessTimeRecord
- 在了解了JavaScript1.7的相关更新后,我们再继续关注JavaScript1.8的新特性。在W3C Group带来的JavaScri
- 上四篇的内容是把常用的XHTML标签拿出来介绍了一下,不是很详细。不过没关系,重点是要能先知道用他们,以后深入了再去细细研究更为详细的特性以
- 如果要问做什么事是最有吸引力,那就是创建Web应用。Web设计者们对设计交互式的Web没有什么更好的办法,却对我们做桌面软件的同事投去少许羡
- 分区表的概念 分区致力于解决支持极大表和索引的关键问题。它采用他们分解成较小和易于管理的称为分区的片(piece)的方法。一旦分区被定义,S
- 在 Google 搜索结果页面中,将其 Logo 图标右键另存为后可以发现,它并非单纯的