Получить текст пространства имен XML через запрос SQL - PullRequest
0 голосов
/ 02 июля 2019

Я работаю с данными XML на SQL Server.(Примерный) SQL выглядит следующим образом:

<Document xmlns="urn:iso:std:iso:20022:some:test:xmlns">
  <Testnode>a</Testnode>
</Document>

XML доступен в таблице со столбцом с именем <fata типа XML.

Мой вопрос: Как мне создать запрос SELECT, который отображает текст пространства имен в одном столбце?

Ожидаемый результат должен быть:

+----------------------------------------+
| xmlns                                  |
+----------------------------------------+
| urn:iso:std:iso:20022:some:test:xmlns  |
+----------------------------------------+

Столбец результата должен быть символьной строкой (без XML).

До сих пор я пробовал этот запрос, однакорезультат NULL:

SELECT Data.value('(./Document)[1]','nvarchar(max)') AS xmlns
FROM xmltable

1 Ответ

1 голос
/ 02 июля 2019

Вы можете попробовать кое-что по этому поводу:

DECLARE @xml XML=
N'<Document xmlns="urn:iso:std:iso:20022:some:test:xmlns">
  <Testnode>a</Testnode>
</Document>';

- XQuery-функция namespace-uri() принимает одиночный код и возвращает его пространство имен uri

SELECT @xml.value('namespace-uri((/*:Document)[1])','nvarchar(max)');

как <Document>Элемент живет в самом пространстве имен по умолчанию, нам нужно знать пространство имен заранее, чтобы объявить его.Но - к счастью - мы можем использовать подстановочный знак с *:.

Другой вариант - один из редких случаев - это использование устаревшего FROM OPENXML:

Попробуйте это:

DECLARE @xml XML=
N'<Document xmlns="urn:iso:std:iso:20022:some:test:xmlns">
  <Testnode>a</Testnode>
</Document>';

DECLARE @docHandle INT;
EXEC sp_xml_preparedocument @docHandle OUTPUT, @xml;  
SELECT * FROM OPENXML (@docHandle, '/*',1);  
EXEC sp_xml_removedocument @docHandle; 

Возвращает полный XML с большим количеством метаданных:

+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| id | parentid | nodetype | localname | prefix | namespaceuri                          | datatype | prev | text                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 0  | NULL     | 1        | Document  | NULL   | urn:iso:std:iso:20022:some:test:xmlns | NULL     | NULL | NULL                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 2  | 0        | 2        | xmlns     | xmlns  | NULL                                  | NULL     | NULL | NULL                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 4  | 2        | 3        | #text     | NULL   | NULL                                  | NULL     | NULL | urn:iso:std:iso:20022:some:test:xmlns |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 3  | 0        | 1        | Testnode  | NULL   | urn:iso:std:iso:20022:some:test:xmlns | NULL     | NULL | NULL                                  |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
| 5  | 3        | 3        | #text     | NULL   | NULL                                  | NULL     | NULL | a                                     |
+----+----------+----------+-----------+--------+---------------------------------------+----------+------+---------------------------------------+
...