Как удалить атрибут из переменной XML в SQL Server 2008? - PullRequest
6 голосов
/ 18 марта 2011

У меня есть таблица с именем 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 строка затронута", но в действительности атрибут xmlns элемента clue_personal_auto не удаляется. Есть идеи, что я делаю не так.

Спасибо BB

Ответы [ 3 ]

4 голосов
/ 18 марта 2011
UPDATE XML
  SET CONVERT(XML, REPLACE(CONVERT(NVARCHAR(MAX), XmlDocument), N' xmlns=...'))
WHERE ID = 357
4 голосов
/ 18 марта 2011

Вам необходимо использовать WITH xmlnamespaces , иначе "/ clue_personal_auto" не соответствует узлу NAMESPACED clue_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
2 голосов
/ 18 марта 2011

Кажется, я не могу найти простой способ сделать это - но реальный вопрос остается: почему вы хотите удалить пространство имен ??Используя конструкцию 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=!

...