【IT168技术文档】现如今,XML已经得到了飞速发展。随着各主流编程语言都逐渐加入对XML的支持,开发人员可以更好地在服务器端操纵XML数据;另外,像XForms等新的Web前端展现技术日趋成熟,开发人员可以更好地在前端展现XML数据;而且,在数据库领域,一些大型数据库也实现了对XML的原生态支持。MySQL这一开源数据库也不甘例外,逐渐增加对XML的支持,以方便开发人员更好地使用XML数据。
为了方便演示,我们先简单创建三个表
person_table:create table person_table
(id int(3) auto_increment not null primary key,
info varchar(500) not null
);
people_table:create table people_table
(id int(3) auto_increment not null primary key,
id_card int(3) not null,
name varchar(10)
);
phone_table:create table phone_table
(id int(3) auto_increment not null primary key,
id_card int(3) not null,
phone int(10)
);
接下来,我将简单地介绍如何在MySQL使用XML数据。
1 插入XML数据
方法1:直接使用insert
我们可以以如下方式往表person_table插入数据:
示例1:往person_table中插入张三和李四的个人信息
mysql> insert into person_table(info) values('
insert into person_table(info) values('
使用这种方式的一种变体为事先将xml存放在文件里,然后采用函数load_file导入。
方法2:Load XML
在MySQL6.0里,增加了一个新的LOAD XML语法(见“MySQL6.0 Reference Manual 12.2.7. LOAD XML Syntax”)。比如有如下xml文件:
2 <list>
3 <person>
4 <id_card>888</id_card>
5 <name>王五</name>
6 <phone>11891233</电话号码>
7 <phone>21893333</电话号码>
8 </person>
9 <person>
10 <id_card>999</id_card>
11 <name>王李无</name>
12 <phone>31891233</电话号码>
13 </person>
14 </list>
通过使用如下命令即可导入xml数据:
示例2:将my.xml文件中的数据导入people_table
mysql> load xml local infile 'my.xml' into table people_table rows identified by ' person
Query OK, 2 rows affected (0.09 sec)
mysql> select * from people_table;
+----+---------+--------+
| id | id_card | name |
+----+---------+--------+
| 1 | 888 | 王五 |
| 2 | 999 | 王李无 |
+----+---------+--------+
两种导入方法各有优缺点。第一种方法采用用varchar即字符串形式存储xml数据,使得存储效率较低,检索速度慢。第二种方法采用分解的方法,将原来的xml数据拆分成关系型的数据,原数据的结构已不再保持;且随着xml结构变得复杂,分解也变得困难;其次,最新的MySQL6.0也只支持3种特定形式的XML类型,显然还远远不够;由于原本统一的数据分散在两个表中(像本文中个人信息的phone只能另外用表phone_table存储),查询时就不得不进行连接,随着XML数据变得复杂,分解的表就会越多,会严重影响查询时的速度。另外,两种方法也都不支持对导入的XML数据进行验证。这两种方法在其他诸多大型数据库中也还在使用,但随着诸多大型数据库陆续支持原生态xml存储,存储和访问xml数据变得更加简单和富有效率!我们希望MySQL在未来能够更好地支持xml。
2 查询和修改XML数据
从MySQL 5.1.5版本起,MySQL添加了对XML文档进行查询和修改的函数,分别是ExtractValue()和UpdateXML()。(详细语法见“MySQL6.0 Reference Manual 11.10 XML Functions")
2.1 ExtractValue(xml_frag, xpath_expr)
第一个参数:xml_frag为XML文档对象的名称
第二个参数:xpath_expr为XPath格式的表达式
作用:从目标XML中返回包含所查询值的字符串
示例3:查询person_table中所有人的姓名
mysql> select ExtractValue(info,'/person/name') from person_table;
+-----------------------------------+
| ExtractValue(info,'/person/name') |
+-----------------------------------+
| 张三 |
| 李四 |
+-----------------------------------+
2 rows in set (0.33 sec)
2.1 UpdateXML(xml_target, xpath_expr, new_xml)
第一个参数:xml_target为XML文档对象的名称
第二个参数:xpath_expr为XPath格式的字符串)
第三个参数:new_value为新值
作用:改变文档中符合条件的节点的值,
将xml_target中满足xpath_expr的数据替换成new_value
示例4:将姓名“张三”更改为“张三三”
mysql> select UpdateXML(info,'/person/name[self:text()="张三"]','张三三')
from person_table;
+-----------------------------------------------------------------------------
| UpdateXML(info,'/person/name[self:text()="张三"]','张三三') |
------------------------------------------------------------------------------
|
one> |
|
1893333 |
+-------------------------------------------------------------------------------
2 rows in set (0.00 sec)
和MySQL其他许多新功能都是通过函数加入的一样,MySQL添加了新函数以支持对XML数据的查询和修改。由于新函数支持XPath表达式,使得查询起来比较方便。但是眼下流行的对xml数据的xquery查询方式,似乎还没有官方支持。MySQL这种仅通过函数支持XML查询的做法在很多时候显得捉襟见肘,以致网络上有大量的第三方开发包/库被开发出来,以方便开发人员更好地在MySQL中查询XML数据。
3 导出XML数据
示例5:以XML形式导出表person_table中的数据
>mysql --xml -e "select info from school.person_table" -uroot -p > person-dump.xml
得到的person-dump.xml内容如下:
2 <resultset statement="select info from school.person_table
3 " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
4 <row>
5 <field name="info"><person><id_card>111</id_card><name>张三三
6 </name><phone>81891233</phone><phone>81893333</phone></person></field>
7 </row>
8 <row>
9 <field name="info"><person><id_card>444</id_card><name>李四
10 </name><phone>81891233</phone><phone>81893333</phone></person></field>
11 </row>
12 </resultset>