【问题标题】:MySQL to update an XML node valueMySQL 更新 XML 节点值
【发布时间】:2016-01-02 03:18:10
【问题描述】:

这和MySQL to update an XML attribute有点关系,不过这次我要更新节点值。我在 marcxml 列中有以下 XMLfragment:

<leader>00227nz  a2200109n  4500</leader>
<controlfield tag="001">1</controlfield>
   ...
<controlfield tag="005">20091210091717.0</controlfield>
        ...

我想更新控制字段值标签 001,使其成为基于查询的数字。像这样:

<leader>00227nz  a2200109n  4500</leader>
<controlfield tag="001">10</controlfield>
   ...
<controlfield tag="005">20091210091717.0</controlfield>
        ...

我最初有以下 mysql 查询:

UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"]', CONCAT('<controlfield tag="001">', '10', '</controlfield>')) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625';

该表是 auth_header 并且它具有 authid 作为主键(但我想这无关紧要)并且它具有存储 xml 的 marcxml 列。查询给了我“0 行受影响”。所以它似乎不起作用。

在此先感谢您!

【问题讨论】:

  • 那么...您的查询不是按书面形式进行的,还是...?
  • 它不起作用,它给了我'0行受影响'。
  • 它似乎有效,我用另一条记录测试,我不知道这很奇怪。:UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"] ', CONCAT('', '10', '' )) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625' ;
  • 请注意,您可以SELECT UpdateXML(...) WHERE ...; 测试UpdateXML() 的结果而无需修改数据库,这可能是一个更好的尝试,首先。修改后的值将显示(作为结果集返回),而不是写入数据库。
  • 这是一个很好的把戏迈克尔。谢谢! :)

标签: mysql xml mysql-5.5 marc


【解决方案1】:

看这里MySQL to update an XML attribute和mysql站点https://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_updatexml的讨论,查询:

UpdateXML(xml_target, xpath_expr, new_xml)

应该可以解决问题。

在问题的情况下,xml_target 是 marcxml。 xpath_expr 是 '//controlfield[@tag="001"]' 这是需要编辑的节点。 new_xml 用于连接所需的数字和结束语句。最后,where 表达式也与上面的 xpath 表达式相同。

因此:

UPDATE auth_header SET marcxml = UpdateXML(marcxml, '//controlfield[@tag="001"]', CONCAT('<controlfield tag="001">', '10', '</controlfield>' )) WHERE Extractvalue(marcxml, '//controlfield[@tag="001"]') ='169625';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多