Это мой пример SQL Server XML
DECLARE @abc varchar(max),@Settingsxml XML,@DoesDefExist varchar(10) SELECT @Settingsxml='<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:Int32 x:Key="abc">1200</sys:Int32> <sys:Int32 x:Key="xyz">300</sys:Int32> <sys:Int32 x:Key="ghi">300</sys:Int32> <sys:String x:Key="def">Forgot your login or password? Please contact the IT Dept.</sys:String> </ResourceDictionary>'
Я хотел бы добавить узел <sys:Int32 x:Key="def">300</sys:Int32> после элемента Key="abc"
<sys:Int32 x:Key="def">300</sys:Int32>
Key="abc"
Тот же ответ, что и marc_s , но с использованием set для переменной XML вместо обновления для табличной переменной Не могу использовать with xmlnamespaces вот так ...
set
with xmlnamespaces
set @Settingsxml.modify('declare default element namespace "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; declare namespace x="http://schemas.microsoft.com/winfx/2006/xaml"; declare namespace sys="clr-namespace:System;assembly=mscorlib"; insert <sys:Int32 x:Key="def">300</sys:Int32> after (/ResourceDictionary/sys:Int32[@x:Key="abc"])[1]')
Вы можете добиться этого с помощью кода примерно так:
-- declare a table variable to hold the data DECLARE @table TABLE (ID INT IDENTITY PRIMARY KEY, XmlContent XML) -- insert your XML into that table variable INSERT INTO @table(XmlContent) VALUES(@Settingsxml) -- define the relevant XML namespaces and UPDATE the table ;WITH XMLNAMESPACES('http://schemas.microsoft.com/winfx/2006/xaml/presentation' AS ns, 'clr-namespace:System;assembly=mscorlib' AS sys, 'http://schemas.microsoft.com/winfx/2006/xaml' as x) UPDATE @table SET XmlContent.modify('insert <sys:Int32 x:Key="def">300</sys:Int32> after (/ns:ResourceDictionary/sys:Int32[@x:Key="abc"])[1]') WHERE ID = 1 -- now, your XML stored in the table variable contains the new element where you wanted to have it SELECT XmlContent FROM @table
В итоге получается:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:sys="clr-namespace:System;assembly=mscorlib"> <sys:Int32 x:Key="abc">1200</sys:Int32> <sys:Int32 x:Key="def">300</sys:Int32> <sys:Int32 x:Key="xyz">300</sys:Int32> <sys:Int32 x:Key="ghi">300</sys:Int32> <sys:String x:Key="def">Forgot your login or password? Please contact the IT Dept.</sys:String> </ResourceDictionary>
Я узнал, как запросить, существует ли узел «abc», и как добавить «def» после «abc». Вот полный код ниже