2015-05-15 3 views
0

У меня был успех в анализе некоторых XML-файлов и обработке рассматриваемого пространства имен. Однако я пришел к некоторым XML-адресам из другого источника, и все работает не так!Проблемы с пространствами имен XML в T-SQL

Вот мой XML (упрощенный)

<ConnectionExport xmlns="http://www.sap.com/IS/Connection" version="14.2.4.732"> 
    <Connection> 
     <technical_name>mytechname</technical_name> 
    </Connection> 
    <Connection> 
     <technical_name>mytechname</technical_name> 
    </Connection> 
</ConnectionExport> 

и мой код для разбора

 SELECT 
      T.c.query('.') 
      ,T.c.value('(@version)','nvarchar(250)')as [version] 
      ,CN.c.query('.') as [connection] 
     FROM 
     @xml.nodes(' 
      declare namespace cnn="http://www.sap.com/IS/Connection"; 
      (cnn:ConnectionExport) 
      ') T(c) 
      outer apply 
      T.c.nodes(' 
       Connection 
      ') as CN(c) 

Первые 2 колонки вернуть все, как и ожидалось, полный текст XML, и значение [версия] , Однако CN.c.query ('.') Просто NULL.

Я знаю, что это как-то связано с пространством имен, потому что он отлично работает, я разделяю все проблемы пространства имен из файла XML и SQL.

В Googled много ... но все еще пытается понять концепцию того, что не так.

ответ

1

Нашли это!

;WITH XMLNAMESPACES ('http://www.sap.com/IS/Connection' AS ns) 
    SELECT 
     T.c.query('.') 
     ,T.c.value('(@version)','nvarchar(250)')as [version] 
     ,CN.c.query('.') as [connection] 
     FROM 
      @xml.nodes('ns:ConnectionExport') T(c) 
      outer apply 
      T.c.nodes('ns:Connection') as CN(c) 
0

Поскольку пространство имен имен по умолчанию, вы можете упростить запрос путем регистрации имен в умолчанию с помощью ;WITH XMLNAMESPACES:

;WITH XMLNAMESPACES (default 'http://www.sap.com/IS/Connection') 
SELECT 
    T.c.query('.') 
    ,T.c.value('(@version)','nvarchar(250)')as [version] 
    ,CN.c.query('.') as [connection] 
    FROM 
     @xml.nodes('ConnectionExport') T(c) 
     outer apply 
     T.c.nodes('Connection') as CN(c) 

Таким образом, все элементы в XQuery неявно рассматривается в неплатеже пространство имен, если не указано иное. Нет необходимости добавлять один и тот же префикс каждый раз, когда мы хотим ссылаться на элемент в xquery.

Смежные вопросы