【问题标题】:Remove XML Nodes for matching attribute condition in SQLServer在 SQLServer 中删除用于匹配属性条件的 XML 节点
【发布时间】:2016-03-09 16:23:08
【问题描述】:

我想删除 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"]')

谢谢!

【问题讨论】:

    标签: sql-server xml tsql xquery-sql


    【解决方案1】:

    如果您想删除具有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

    【讨论】:

      【解决方案2】:

      试试这样,这是一个命名空间问题...

      declare @x table(myXML xml);
      insert into @x values(
      '<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>');
      
      ;WITH XMLNAMESPACES (DEFAULT 'http://www.imsglobal.org/xsd/imsqti_v2p2')
      Update @x 
      SET [myXML].modify('delete /metadata/contents/content[2]/resources/resource[@type != "image/svg"]')
      
      SELECT * FROM @x;
      

      【讨论】:

      • 是的 - 或者将 NS: 前缀添加到链下的 ech 节点。
      猜你喜欢
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多