7

我有一个名为 XML 的表(在 SQL Server 2008 中),它有一个名为XmlDocumenttype的字段XML。我正在尝试从 XML 变量中删除属性。

这是我的 xml 的样子

<clue_personal_auto xmlns="http://cp.com/rules/client">
  <admin>
     <receipt_date>03/16/2011</receipt_date>
     <date_request_ordered>03/16/2011</date_request_ordered>
     <report_usage>Personal</report_usage>
  </admin>
</clue_personal_auto>

我的查询

UPDATE XML
SET XmlDocument.modify('delete  (/clue_personal_auto/@xmlns)[1]')
 WHERE xmlid = 357

当我在查询分析器中运行此查询时,我看到消息“1 行受影响”,但实际上没有删除线索_personal_auto 元素的 xmlns 属性。知道我做错了什么。

谢谢BB

4

3 回答 3

6

您需要使用WITH xmlnamespacesclue_personal_auto xmlns="..." ,否则 "/clue_personal_auto" 与 NAMESPACED节点不匹配。

不仅如此,您实际上无法删除命名空间,因为它不是普通属性。

删除常规属性的示例

declare @xml table (xmlid int, xmldocument xml)
insert @xml select 357, '
<clue_personal_auto xmlns="http://cp.com/rules/client" otherattrib="x">
  <admin>
     <receipt_date>03/16/2011</receipt_date>
     <date_request_ordered>03/16/2011</date_request_ordered>
     <report_usage>Personal</report_usage>
  </admin>
</clue_personal_auto>'

;WITH XMLNAMESPACES ('http://cp.com/rules/client' as ns)
UPDATE @XML
SET XmlDocument.modify('delete  (/ns:clue_personal_auto/@otherattrib)[1]')
WHERE xmlid = 357

select * from @xml
于 2011-03-17T22:08:39.503 回答
6
UPDATE XML
  SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...'))
WHERE ID = 357
于 2011-03-17T22:14:45.440 回答
2

我似乎找不到一个简单的方法来做到这一点 - 但真正的问题仍然存在:你为什么要删除命名空间?使用该WITH XMLNAMESPACES ...构造,您可以轻松地使用命名空间。

与其花费大量精力来摆脱它 - 了解 XML 名称空间并开始使用它们!

您可以很容易地在查询中使用该 XML 命名空间:

;WITH XMLNAMESPACES (DEFAULT 'http://cp.com/rules/client' )
SELECT
    XmlDocument.value('(/clue_personal_auto/admin/report_usage)[1]', 'varchar(25)')
FROM XML
WHERE ID = 357

并对此感到满意 - 不再需要人为地删除xmlns=声明!

于 2011-03-17T22:10:16.773 回答