技术开发 频道

在MySQL中使用XML数据

  【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('111

  张三8189123381893333');

  insert into person_table(info) values('444

  李四8189123381893333');

  使用这种方式的一种变体为事先将xml存放在文件里,然后采用函数load_file导入。

  方法2:Load XML

  在MySQL6.0里,增加了一个新的LOAD XML语法(见“MySQL6.0 Reference Manual 12.2.7. LOAD XML Syntax”)。比如有如下xml文件:  

1 <?xml version="1.0"?>
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()="张三"]','张三三') |

  ------------------------------------------------------------------------------

  | 111张三三8189123381893333

  one> |

  | 444李四818912338

  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内容如下:  

1 <?xml version="1.0"?>
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>

 

0
相关文章