2011-09-29 3 views
0

Je souhaite remplacer la valeur d'un attribut dans un fichier XML. Cet attribut vient plusieurs fois dans le fichier XML. Comment puis-je remplacer ces tout à la foisSQL Server XML Remplacer les valeurs dans l'attribut

mon xml lools ce que certains comme ci-dessous:

<Example> 
    <A> 
    <B Type = "x">qqq</B> 
    <B Type = "x">www</B> 
    </A> 
    <C> 
    <D Type = "x">aaa</D> 
    <D Type = "x">uuu</D> 
    </C> 
</Example> 

Je veux remplacer tous les x avec y

Répondre

1

Vous ne pouvez pas remplacer à la fois en utilisant replace value of (XML DML). Vous devez le faire en boucle.

declare @xml xml = ' 
<Example> 
    <A> 
    <B Type = "x">qqq</B> 
    <B Type = "x">www</B> 
    </A> 
    <C> 
    <D Type = "x">aaa</D> 
    <D Type = "x">uuu</D> 
    </C> 
</Example> 
' 

while (select @xml.exist('//*[@Type = "x"]')) = 1 
begin 
    set @xml.modify('replace value of (//*[@Type = "x"]/@Type)[1] with "y"') 
end 

select @xml 

Résultat:

<Example> 
    <A> 
    <B Type="y">qqq</B> 
    <B Type="y">www</B> 
    </A> 
    <C> 
    <D Type="y">aaa</D> 
    <D Type="y">uuu</D> 
    </C> 
</Example> 

Mise à jour

Remplacer les valeurs x et z avec y:

while (select @xml.exist('//*[@Type = ("x","z")]')) = 1 
begin 
    set @xml.modify('replace value of (//*[@Type = ("x","z")]/@Type)[1] with "y"') 
end 

Remplacer toutes les valeurs avec y:

while (select @xml.exist('//*[@Type != "y"]')) = 1 
begin 
    set @xml.modify('replace value of (//*[@Type != "y"]/@Type)[1] with "y"') 
end 
+0

Salut Mikael, Merci pour la réponse cela fonctionne bien, mais j'ai un autre problème ici l'attribut type est différent dans chaque élément par exemple dans l'ensemble de l'élément A il est x et en entier de Elemnt B il est z et i avoir à remplacer tous z et x avec y .. comment puis-je faire cela ... – Santy

+0

@Santy - Réponse mise à jour avec des alternatives. –