替换数据库中的XML文档中的值

时间:2011-12-02 17:46:37

标签: mysql regex

我有一个存储在MySQL中的大量XML文档列表(是的,我知道......),我想知道是否有一种简单的方法可以使用SQL进行搜索和替换文档。

在下面的示例中,我正在尝试将mandown(值和元素)替换为emergkey

原件:

<clouddata>
 <type>mandown</type>
 <devicedata>
  <nomotion>0</nomotion>
  <mandown>1</mandown>
 </devicedata>
</clouddata>

所需:

<clouddata>
 <type>emergkey</type>
 <devicedata>
  <nomotion>0</nomotion>
  <emergykey>1</emergkey>
 </devicedata>
</clouddata>

请注意,我已经简化了这些示例,并且实际数据具有不同的长度,并且元素不一定都是相同的。

3 个答案:

答案 0 :(得分:2)

SELECT UpdateXml(UpdateXML(.., '//type', '<type>mandown</type>'), 
'//mandown', '<emergykey>1</emergkey>') as new_xml;

docs: - http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html#function_updatexml

(我相信可以改进)

答案 1 :(得分:1)

脑死亡方法

UPDATE yourtable SET xmlfield=REPLACE(xmlfield, 'mandown', 'emergykey');

或以稍微安全的方式:

UPDATE yourtable SET xmlfield=REPLACE(xmlfield, '<mandown>', '<emergykey>');
UPDATE yourtable SET xmlfield=REPLACE(xmlfield, '</mandown>', '</emergykey>');
UPDATE yourtable SET xmlfield=REPLACE(xmlfield, '<type>mandown</type>', '<type>emergykey</type>');

一种真正安全的方法是将每条记录拉入DOM并在那里进行操作,尽管这在大型桌面上会很慢。

答案 2 :(得分:1)

  

...使用SQL进行搜索和替换文档的简单方法。

我不建议这样做,原因就是说你不应该在HTML / XML上使用正则表达式。

您知道自己的数据非常好,而且您绝对不会产生任何副作用,您可以使用简单的replace()来电。

如果您不确定或操作过于复杂而无法更换字符串,我建议您使用XSLT和一个逐个遍历记录的脚本。

对于您的问题,这个XSLT样式表就是您所需要的:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="node()|@*">
    <xsl:copy><xsl:apply-templates match="node()|@*" /></xsl:copy>
  </xsl:template>

  <xsl:template match="devicedata/mandown">
    <emergykey><xsl:apply-templates match="node()|@*" /></emergkey>
  </xsl:template>
</xsl:stylesheet>