如何将 xml 属性添加到 xml 文档的所有节点?
How to add xml attribute to all nodes of xml document?
我有一个名为 XmlDocument 的数据库 table 带有 XML 字段,用于存储xml。这是存储 xml:
的示例
<ol type="decimal" id="id-a4bb3b6d-9908-4972-8b02-72e286795b7a">
<item id="id-92332716-4561-4874-d353-39fdf993fa89">
<para id="id-a3fae837-59d8-4702-b689-f869137a92a7">Item1</para>
</item>
<item id="id-d8031e83-5b68-47cb-f535-41bee9682f4a">
<para id="id-8746fe56-3160-4543-bf28-5f1e1de83ec0">Item2</para>
</item>
</ol>
我的目标是编写一个 tsql 脚本,它将 revNumber 属性添加到没有此属性的文档的所有节点。它应该是这样的:
<ol revNumber="1.1" type="decimal" id="id-a4bb3b6d-9908-4972-8b02-72e286795b7a">
<item revNumber="1.2" id="id-92332716-4561-4874-d353-39fdf993fa89">
<para revNumber="1.3" id="id-a3fae837-59d8-4702-b689-f869137a92a7">Item1</para>
</item>
<item revNumber="1.0" id="id-d8031e83-5b68-47cb-f535-41bee9682f4a">
<para revNumber="1.2" id="id-8746fe56-3160-4543-bf28-5f1e1de83ec0">Item2</para>
</item>
</ol>
如果节点已经有这个属性,我们应该跳过它。我们可以使用类似的东西,但它只适用于一个节点:
SET @requestXML.modify(
'insert
(
attribute revNumber {sql:variable("@revNum") }
)
into (/ol)[1]')
但文档的结构可能不同。最好的方法是什么?
终于找到了解决办法:
declare @xml XML = '
<root>
<text>test</text>
<text>test</text>
<text>test</text>
<text>test</text>
</root>
'
while @xml.exist('//*[not(@TEST)]') = 1
begin
set @xml.modify('
insert attribute TEST {"value"}
into (//*[not(@TEST)])[1]
')
end
select @xml
我有一个名为 XmlDocument 的数据库 table 带有 XML 字段,用于存储xml。这是存储 xml:
的示例<ol type="decimal" id="id-a4bb3b6d-9908-4972-8b02-72e286795b7a">
<item id="id-92332716-4561-4874-d353-39fdf993fa89">
<para id="id-a3fae837-59d8-4702-b689-f869137a92a7">Item1</para>
</item>
<item id="id-d8031e83-5b68-47cb-f535-41bee9682f4a">
<para id="id-8746fe56-3160-4543-bf28-5f1e1de83ec0">Item2</para>
</item>
</ol>
我的目标是编写一个 tsql 脚本,它将 revNumber 属性添加到没有此属性的文档的所有节点。它应该是这样的:
<ol revNumber="1.1" type="decimal" id="id-a4bb3b6d-9908-4972-8b02-72e286795b7a">
<item revNumber="1.2" id="id-92332716-4561-4874-d353-39fdf993fa89">
<para revNumber="1.3" id="id-a3fae837-59d8-4702-b689-f869137a92a7">Item1</para>
</item>
<item revNumber="1.0" id="id-d8031e83-5b68-47cb-f535-41bee9682f4a">
<para revNumber="1.2" id="id-8746fe56-3160-4543-bf28-5f1e1de83ec0">Item2</para>
</item>
</ol>
如果节点已经有这个属性,我们应该跳过它。我们可以使用类似的东西,但它只适用于一个节点:
SET @requestXML.modify(
'insert
(
attribute revNumber {sql:variable("@revNum") }
)
into (/ol)[1]')
但文档的结构可能不同。最好的方法是什么?
终于找到了解决办法:
declare @xml XML = '
<root>
<text>test</text>
<text>test</text>
<text>test</text>
<text>test</text>
</root>
'
while @xml.exist('//*[not(@TEST)]') = 1
begin
set @xml.modify('
insert attribute TEST {"value"}
into (//*[not(@TEST)])[1]
')
end
select @xml