7

XML (SQL Server 2008) というテーブルがありXmlDocument、タイプというフィールドがあり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 行が影響を受けました」というメッセージが表示されますが、実際には、clue_personal_auto 要素の xmlns 属性が削除されていません。私が間違っていることは何ですか。

ありがとうBB

4

3 に答える 3

6

WITH xmlnamespacesを使用する必要があります。そうしないと、「/clue_personal_auto」が NAMESPACEDclue_personal_auto xmlns="..."ノードと一致しません。

それだけでなく、名前空間は通常の属性ではないため、実際には削除できません。

通常の属性を削除する例

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 名前空間について学び、それらを使い始めましょう!

クエリでその 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 に答える