Парсинг xml sql
Помогите распарсить подобный хмл, не могу понять как правильно определить ноду и путь
declare @bxml nvarchar(max)
set @bxml = '
<kk:Текст xmlns:kk="http://адрес" xmlns="http://адрес2" xmlns:kk3="http://адрес3" xmlns:kk4="http://адрес4" xmlns:kk5="адрес5">
<kk:Раздел>
<kk:Запрос>
<Дата xmlns="http://адрес2">1900-03-03</Дата>
<Номер xmlns="http://адрес2">999-999</Номер>
</kk:Запрос>
<kk:Номер>555-555</kk:Номер>
<kk:Свед>1900-01-01</kk:Свед>
<kk:Дата>1900-02-02</kk:Дата>
</kk:Раздел>
</kk:Текст>
'
select
[Номер] = T.c.value('declare namespace PD="http://адрес2"; (./PD:Номер)[1]','varchar(50)')
from (select bxml = convert(xml, @bxml) ) xx
cross apply
xx.bxml.nodes('declare namespace PD="http://адрес2"; /PD:Текст/PD:Запрос') T(c)
Ответы (1 шт):
Автор решения: Yitzhak Khabinsky
→ Ссылка
Пожалуйста, попробуйте следующее решение.
Я предполагаю, что это MS SQL Server.
Лучше использовать тип данных XML вместо NVARCHAR(MAX).
SQL
DECLARE @xml XML =
N'<kk:Текст xmlns:kk="http://адрес" xmlns="http://адрес2" xmlns:kk3="http://адрес3" xmlns:kk4="http://адрес4">
<kk:Раздел>
<kk:Запрос>
<Дата xmlns="http://адрес2">1900-03-03</Дата>
<Номер xmlns="http://адрес2">999-999</Номер>
</kk:Запрос>
<kk:Номер>555-555</kk:Номер>
<kk:Свед>1900-01-01</kk:Свед>
<kk:Дата>1900-02-02</kk:Дата>
</kk:Раздел>
</kk:Текст>';
;WITH XMLNAMESPACES('http://адрес' AS kk, DEFAULT 'http://адрес2')
SELECT [Запрос_Дата] = c.value(N'(kk:Запрос/Дата/text())[1]','DATE')
, [Запрос_Номер] = c.value(N'(kk:Запрос/Номер/text())[1]','VARCHAR(50)')
, [Номер] = c.value(N'(kk:Номер/text())[1]','VARCHAR(50)')
, [Дата] = c.value(N'(kk:Дата/text())[1]','DATE')
FROM @xml.nodes(N'/kk:Текст/kk:Раздел') AS t(c);
Результат
| Запрос_Дата | Запрос_Номер | Номер | Дата |
|---|---|---|---|
| 1900-03-03 | 999-999 | 555-555 | 1900-02-02 |