sql-server - 删除 XML 节点以匹配 SQLServer 中的属性条件

标签 sql-server xml tsql xquery-sql

我想删除 XML 数据类型列中的所有节点;匹配所有记录的属性条件。例如<resource>具有属性“type”的节点,其值类似于“%audio%”。

输入:

<metadata Item="1234" version="5" packageVersion="5" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2">
  <contents>
    <content version="0" href="content_es-mx_en-us.xml" lang="es-mx" altlang="en-us">
      <resources />
    </content>
    <content version="3" href="content_en-us.xml" lang="en-us">
      <resources>
        <resource type="image/svg" href="girlwateringtomatoes2.svg" />
        <resource type="audio/ogg" href="Audio/115988A_Sound1.ogg" />
        <resource type="audio/mp4" href="Audio/115988A_Sound1.m4a" />  
      </resources>
    </content>
  </contents>
  <references />
  <brailleEncodings />
</metadata>

输出:

<metadata Item="1234" version="5" packageVersion="5" xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2">
  <contents>
    <content version="0" href="content_es-mx_en-us.xml" lang="es-mx" altlang="en-us">
      <resources />
    </content>
    <content version="3" href="content_en-us.xml" lang="en-us">
      <resources>
        <resource type="image/svg" href="girlwateringtomatoes2.svg" /> 
      </resources>
    </content>
  </contents>
  <references />
  <brailleEncodings />
</metadata>

这是我试过但没有用的查询。

;WITH XMLNAMESPACES ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS NS)
Update dbo.TableX 
SET [XML].modify('delete /NS:metadata/NS:contents/NS:content[2]/resources/resource[@type != "image/svg"]')

谢谢!

最佳答案

如果您想删除所有具有type 的内容,例如audio,您可以使用contains :

;WITH XMLNAMESPACES ('http://www.imsglobal.org/xsd/imsqti_v2p2' AS NS)
Update TableX 
SET [XML].modify('delete /NS:metadata/NS:contents/NS:content[2]/NS:resources/NS:resource[contains(@type, "audio")]'); 

LiveDemo

输出:

<metadata xmlns="http://www.imsglobal.org/xsd/imsqti_v2p2" Item="1234" version="5" packageVersion="5">
   <contents>
      <content version="0" href="content_es-mx_en-us.xml" lang="es-mx" altlang="en-us">
         <resources />
      </content>
      <content version="3" href="content_en-us.xml" lang="en-us">
         <resources>
            <resource type="image/svg" href="girlwateringtomatoes2.svg" />
         </resources>
      </content>
   </contents>
   <references />
   <brailleEncodings />
</metadata>

或者在 XML 文档中的任何位置:

;WITH XMLNAMESPACES (DEFAULT 'http://www.imsglobal.org/xsd/imsqti_v2p2' )
Update TableX 
SET [XML].modify('delete //resources/resource[contains(@type, "audio")]');  

LiveDemo2

关于sql-server - 删除 XML 节点以匹配 SQLServer 中的属性条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897068/

相关文章:

xml - 使用 Perl 解析 XML 文件

tsql - T-SQL-每个项目的运行总计

sql - SQL Server 是否有办法知道何时将列添加到表中?

mysql - 从现有数据生成缺失数据

sql - 存储过程计算和性能改进

android - 如何在 xml 中的 Fragment 中的 ListView 上方放置 float 操作按钮 (FAB)?

jquery - ajax xml 出现空数据错误

sql - 在 SQL Server 中将天数转换为完整日期

c# - 给定一个作为字符串的 T-SQL 类型,将其评估为 .Net 类型的最简单方法是什么?

c# - SQL参数异常: The SqlParameter is already contained by another SqlParameterCollection