2015-10-05 94 views
1

这与此MySQL to update an XML attribute稍有关系,但是这次我想更新节点值。我有以下XMLfragment这是MARCXML列:MySQL更新XML节点值

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

我想更新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作为主键(但我想这不会不管),它具有MARCXML存储xml的列。查询给我'0行受到影响。'所以它似乎不起作用。

在此先感谢和欢呼!

+0

所以...书面,还是您的查询不行...? –

+0

它不起作用,它给了我'0行受影响'。 – schnydszch

+0

它似乎工作,我测试了另一个记录,我不知道它只是奇怪:更新auth_header SET marcxml = UpdateXML(marcxml,'//控制字段[@标记=“001”]',CONCAT('','10',''))WHERE Extractvalue(marcxml,'// controlfield [@ tag =“001”]')='169625'; – schnydszch

回答

0

望着这里的讨论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是concat,所需的数字和结束语句。最后,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';