2011-12-02 53 views
0

我有一大堆存儲在MySQL中的XML文檔(是的,我知道......),我想知道是否有一種簡單的方法來搜索和替換文檔只使用SQL。替換數據庫中的值和XML文檔

在下面的示例中,我試圖用emergkey替換mandown(都是值&元素)。

原文:

<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> 

請注意,我已經簡化這些例子和真實的數據是不同的長度和元素不一定下令都是一樣的。

回答

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,做那裏的業務,雖然這在一張大桌子上會很慢。

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>