Игнорировать пространство имен 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 он возвращает данные.