2016-05-07 3 views
1

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

XML-файл выглядит следующим образом

<?xml version="1.0" encoding="UTF-8"?> 
<Status:orders xmlns:Status="http://www.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com Status.xsd"> 
    <order> 
    <Header> 
     <Name>500039</Name> 
     <Letter>A</Letter> 
    </Header> 
    </order> 
</Status:orders> 

вы можете помочь, как получить значения для имени и буквенных теги

заранее спасибо.

+0

Привет eliv, является этим вопрос решается? Вам нужна дополнительная помощь? – Shnugo

ответ

0

Ваш друг называется WITH XMLNAMESPACES ...

Попробуй как этот

DECLARE @xml XML= 
'<?xml version="1.0" encoding="UTF-8"?> 
<Status:orders xmlns:Status="http://www.test.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.test.com Status.xsd"> 
    <order> 
    <Header> 
     <Name>500039</Name> 
     <Letter>A</Letter> 
    </Header> 
    </order> 
</Status:orders>'; 

WITH XMLNAMESPACES('http://www.test.com' AS Status) 
SELECT @xml.value('(/Status:orders/order/Header/Name)[1]','int') 
     ,@xml.value('(/Status:orders/order/Header/Letter)[1]','varchar(max)'); 

Альтернативой было, чтобы использовать звездочку.

SELECT @xml.value('(/*:orders/order/Header/Name)[1]','int') 
     ,@xml.value('(/*:orders/order/Header/Letter)[1]','varchar(max)'); 

Другого вариант был такой:

SELECT @xml.value('(//Name)[1]','int') 
     ,@xml.value('(//Letter)[1]','varchar(max)'); 

Но в целом это хороший совет, чтобы быть как можно более конкретным ...

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