使用SQL更改XML中特定节点的属性值

时间:2019-02-26 13:43:55

标签: xml tsql

我想知道如何根据另一个属性的值更新XML属性吗?

在以下示例中,我要设置String x = grades.getText(); String [] grades = new String [100]; for (int i = 0; i < x.length() ;i++) { if (x.charAt(i) == ',') { grades[i] = x.substring(0, i); x = x.substring(i + 1, x.length()); System.out.println(grades[i]); i = 0; } } System.out.println(x); //last x will your last element ,其中b="321"

a="banana"

此选择可以很好地提取所需的值,但是如何对其进行修改?

Declare @t table ( x xml )
insert into @t(x) values ('<n1><n2 a="apple" b="2" /><n2 a="banana" b="21" /></n1>')

此更新不执行任何操作...

select m.n.value('@b', 'int') from @t 
  outer apply x.nodes('/n1/n2') as m(n)
  where m.n.value('@a', 'nvarchar(max)') = 'banana'

此更新更改了第一个节点,这不是期望的结果

update @t
  set x.modify('replace value of (/n1/n2/@b)[1] with "321"')
  where x.value('(n1/n2/@b)[1]', 'nvarchar(max)') = 'banana'

select * from @t

在此先感谢您的帮助...

1 个答案:

答案 0 :(得分:1)

尝试一下

Declare @t table ( x xml )
insert into @t(x) values ('<n1><n2 a="apple" b="2" /><n2 a="banana" b="21" /></n1>');

UPDATE @t SET x.modify('replace value of (/n1/n2[@a="banana"]/@b)[1] with "321"');

SELECT * FROM @t;

简而言之:

您必须告诉您要替换的内容。在这种情况下,@b元素中的属性<n1>的值,其中属性@a是“ banana”。这需要XPath中的谓词。您的阅读方式如下:

*找到n1并在n2之下,检查属性为a的“香蕉”之一。是的,您找到了吗?大!不接受并更改第一次出现的属性b