Игнорировать пространство имен XML в T-SQL

Как удалить / игнорировать пространство имен 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 ответов


просто использовать это:

;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 пространство имен и покончим с этим.


я столкнулся с той же проблемой в моем 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 он возвращает данные.