我有一个存储在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>
请注意,我已经简化了这些示例,并且实际数据具有不同的长度,并且元素不一定都是相同的。
答案 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>