Игнорировать пространство имен XML в T-SQL - PullRequest
9 голосов
/ 29 марта 2011

Как удалить / игнорировать пространство имен XML в файле XML при запросе данных с помощью T-SQL?

Я загружаю XML-файл в переменную, и он работает просто отлично. Но у xml есть набор пространств имен, и если я не удалю его, мои запросы будут пустыми.

T-SQL:

DECLARE @xml xml
SELECT @xml = BulkColumn FROM OPENROWSET(BULK 'C:\myfile.xml', SINGLE_BLOB) AS A

SELECT X.z.value('ID[1]', 'VARCHAR(3)') FROM @xml.nodes('myroot/element') AS X(z)

Пример XML:

<?xml version="1.0" encoding="utf-8"?>
<myroot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <element>
    <ID>1</ID>
  </element>
  <element>
    <ID>2</ID>
  </element>
  <element>
    <ID>3</ID>
  </element>
</myroot>

Это работает, запрос возвращает это:

1
2
3

Но XML также содержит пространство имен по умолчанию:

<myroot xmlns="http://XXX" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

xmlns="http://XXX" полностью испортил мой запрос. И, к сожалению, ручная модификация xml перед загрузкой - это не вариант.

Вопросы:

  • Как мне удалить или игнорировать пространство имен при загрузке данных в переменную?
  • Или как мне изменить мой запрос для обработки пространства имен?

Ответы [ 2 ]

19 голосов
/ 29 марта 2011

Просто используйте это:

;WITH XMLNAMESPACES(DEFAULT 'http://XXX')
SELECT 
    X.z.value('ID[1]', 'VARCHAR(3)') 
FROM 
    @xml.nodes('/myroot/element') AS X(z)

WITH XMLNAMESPACES позволяет вам определять псевдонимы пространства имен для ваших запросов, и если вам не нужен конкретный префикс пространства имен XML, вы можете просто определить его как DEFAULT пространство имен и покончить с этим.

3 голосов
/ 21 сентября 2012

Я столкнулся с той же проблемой в моем XML-запросе.Namespace "xmlns="urn:tradefeed-xsd" создает проблему, и мой запрос возвращается пустым.

<?xml version="1.0" encoding="UTF-8" ?> 
<BatchFeed xmlns="urn:tradefeed-xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

Как только я использовал оператор ;WITH XMLNAMESPACES(DEFAULT 'urn:tradefeed-xsd') перед моим оператором select, он возвращает данные.

...