世俱杯 2025

MySQL中XPath使用详解

原创|其它|编辑:郝浩|2009-12-24 11:43:04.000|阅读 1765 次

概述:今天我要为大家介绍的是XPath,XPath是导航和查询XML文档的语言。我们从一个函数开始。

# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>

  今天我要为大家介绍的是XPath,XPath是导航和查询XML文档的语言。我们从一个函数开始。

  UpdateXML()函数

  我们已经花了很多时间介绍ExtractValue()函数,但还没有介绍MySQL的其它XML函数,如UpdateXML(),因为我们先前主要将内容放在将XML文档中的数据导入到MySQL数据库中了,UpdateXML()是一个使用不同的XML标记匹配和替换XML块的函数。

  ExtractValue()有两个字符串参数,一个XML标记,一个XPath表达式。


  ExtractValue(xml_frag, xpath_expr)


   它返回第一个匹配XPath表达式的文本节点。假设你想将“”变为“”,并将结果保存到一个变量中,下面是使用UpdateXML()函数实现这个目标的做法:


  mysql> SELECT @new_xml_node:=UpdateXML('',
  -> '//city',
  -> '')
  -> AS xml_node;
  +-----------------------------------------+
  | xml_node |
  +-----------------------------------------+
  | |
  +-----------------------------------------+
  1 row in set (0.03 sec)
  mysql> SELECT @new_xml_node;
  +-----------------------------------------+
  | @new_xml_node |
  +-----------------------------------------+
  | |
  +-----------------------------------------+
  1 row in set (0.00 sec)


  如果没有发现匹配表达式的文本节点,就返回原始XML字符串。


  mysql> SELECT @new_xml_node:=UpdateXML('',
  -> '//dummy',
  -> '')
  -> AS xml_node;
  +---------------------------+
  | xml_node |
  +---------------------------+
  | |
  +---------------------------+
  1 row in set (0.03 sec)

  如果发现有多个都匹配,会按顺序返回每个匹配的子文本节点的内容。


  mysql> SELECT @new_xml_node:=UpdateXML('',
  -> '//city,
  -> '')
  -> AS xml_node;
  +----------------------------------------------+
  | xml_node |
  +----------------------------------------------+
  | |
  +----------------------------------------------+
  1 row in set (0.00 sec)


   因为UpdateXML()函数在匹配到空元素和没有匹配之间没有区别,要区别它们可以使用XPath count()函数测试ExtractValue()的返回。


  mysql> SELECT ExtractValue('',
  -> 'count(//city)') AS xml_node;
  +----------+
  | xml_node |
  +----------+
  | 3 |
  +----------+
  1 row in set (0.00 sec)
  mysql> SELECT ExtractValue('',
  -> 'count(//county)') AS xml_node;
  +----------+
  | xml_node |
  +----------+
  | 0 |
  +----------+
  1 row in set (0.00 sec)


  错误处理

  对ExtractValue() 和 UpdateXML(),使用的XPath定位器必须是有效的,被搜索的XML必须是结构良好的,如果定位器无效,则会产生一个错误。


  mysql> SELECT @new_xml_node:=UpdateXML('',
  -> '//city/"state', '') AS xml_node;
   ERROR 1105 (HY000): XPATH syntax error: '"state'

  如果被搜索的XML结构不好,则会返回null,并产生一个警告。


  mysql> SELECT @new_xml_node:=UpdateXML('', '//city',
  -> '') AS xml_node;
  +----------+
  | xml_node |
  +----------+
  | NULL |
  +----------+
  1 row in set, 1 warning (0.01 sec)


  可以使用show warnings命令显示警告。


  mysql> show warnings;
  +---------+------+-----------------------------------+
  | Level | Code | Message |
  +---------+------+-----------------------------------+
  | Warning | 1525 | Incorrect XML value: 'parse error at line 1 pos 21: '' unexpected ('' wanted)' |
  +---------+------+-----------------------------------+
  1 row in set (0.01 sec)


  作为第三个参数传递给UpdateXML()的替换XML则不会检查结构。


  mysql> SELECT @new_xml_node:=UpdateXML('', '//city',
  -> '<>') AS xml_node;
  +-------------------------------------------+
  | xml_node |
  +-------------------------------------------+
  | <> |
  +-------------------------------------------+
  1 row in set (0.00 sec)


  在XPath表达式中使用变量

  从MySQL 5.1.20开始,可以在XPath定位器参数中使用变量,这样在传递参数时就更加灵活了,根据使用的语法不同,可以对变量实施弱检查或强检查。

  错误处理

  对ExtractValue() 和 UpdateXML(),使用的XPath定位器必须是有效的,被搜索的XML必须是结构良好的,如果定位器无效,则会产生一个错误。


  mysql> SELECT @new_xml_node:=UpdateXML('',
  -> '//city/"state', '') AS xml_node;
   ERROR 1105 (HY000): XPATH syntax error: '"state'

  如果被搜索的XML结构不好,则会返回null,并产生一个警告。


  mysql> SELECT @new_xml_node:=UpdateXML('', '//city',
  -> '') AS xml_node;
  +----------+
  | xml_node |
  +----------+
  | NULL |
  +----------+
  1 row in set, 1 warning (0.01 sec)


  可以使用show warnings命令显示警告。


  mysql> show warnings;
  +---------+------+--------------------------------------+
  | Level | Code | Message |
  +---------+------+--------------------------------------+
  | Warning | 1525 | Incorrect XML value: 'parse error at line 1 pos 21: '' unexpected ('' wanted)' |
  +---------+------+--------------------------------------+
  1 row in set (0.01 sec)


  作为第三个参数传递给UpdateXML()的替换XML则不会检查结构。


  mysql> SELECT @new_xml_node:=UpdateXML('', '//city',
  -> '<>') AS xml_node;
  +-------------------------------------------+
  | xml_node |
  +-------------------------------------------+
  | <> |
  +-------------------------------------------+
  1 row in set (0.00 sec)


  在XPath表达式中使用变量

  从MySQL 5.1.20开始,可以在XPath定位器参数中使用变量,这样在传递参数时就更加灵活了,根据使用的语法不同,可以对变量实施弱检查或强检查。


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@dpuzeg.cn

文章转载自:网络转载

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP