在 SQL Server 中删除 XML 个匹配属性条件的节点
Remove XML Nodes for matching attribute condition in SQLServer
我想删除 XML 数据类型列中的所有节点;匹配所有 records.For 示例 <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"]')
谢谢!
像这样尝试,这是一个命名空间问题...
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;
如果你想删除所有有 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")]');
输出:
<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")]');
我想删除 XML 数据类型列中的所有节点;匹配所有 records.For 示例 <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"]')
谢谢!
像这样尝试,这是一个命名空间问题...
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;
如果你想删除所有有 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")]');
输出:
<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")]');