【发布时间】: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()的结果而无需修改数据库,这可能是一个更好的尝试,首先。修改后的值将显示(作为结果集返回),而不是写入数据库。 -
这是一个很好的把戏迈克尔。谢谢! :)