2016-11-02 2 views
1

je code comme ci-dessous:SQL Server: sélectionner xml avec espace de noms

declare @strXML nvarchar(max) = 
'<?xml version="1.0" encoding="utf-16"?> 
    <GetDictResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <GetDictResult> 
    <Success xmlns="http://or.org/ValidationSchema.xsd">true</Success> 
    <Dicts xmlns="http://or.org/ValidationSchema.xsd"> 
     <Dict> 
     <Code>TADR</Code> 
     <Name>Type of address</Name> 
     </Dict> 
    </Dicts> 
    </GetDictResult> 
</GetDictResponse> 
' 

declare @xml xml = CONVERT(XML,CONVERT(NVARCHAR(MAX),@strXML)) 

--empty row result 
SELECT 
    ltrim(rtrim(T.c.value('Code[1]','VARCHAR(max)'))) Code, 
    ltrim(rtrim(T.c.value('Name[1]','VARCHAR(max)'))) Name 
FROM @xml.nodes('*/*/*/*') AS T(C) 
--any rows 
SELECT 
    ltrim(rtrim(T.c.value('Code[1]','VARCHAR(max)'))) Code, 
    ltrim(rtrim(T.c.value('Name[1]','VARCHAR(max)'))) Name 
FROM @xml.nodes('GetDictResponse/GetDictResult/Dicts/Dict') AS T(C) 

Comment puis-je obtenir Code et Name valeurs?

Cordialement, R.B.

Répondre

0

Essayez ceci:

DECLARE @strXML XML = 
'<GetDictResponse xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <GetDictResult> 
     <Success xmlns="http://or.org/ValidationSchema.xsd">true</Success> 
     <Dicts xmlns="http://or.org/ValidationSchema.xsd"> 
     <Dict> 
     <Code>TADR</Code> 
     <Name>Type of address</Name> 
     </Dict> 
    </Dicts> 
    </GetDictResult> 
</GetDictResponse>' 

;WITH XMLNAMESPACES('http://or.org/ValidationSchema.xsd' as ns) 
    SELECT 
     Code = c.value('ns:Code[1]', 'NVARCHAR(20)'), 
     Name = c.value('ns:Name[1]', 'NVARCHAR(20)') 
    FROM 
     @strXml.nodes('/GetDictResponse/GetDictResult/ns:Dicts/ns:Dict') AS T(C) 

Un problème est l'en-tête XML vous - pouvez-vous vous débarrasser de cela? Sans cela, ce code renvoie les valeurs désirées:

enter image description here