Din xml innehåller ett namnområde xmlns="http://www.webserviceX.NET/"
, som är standardnamnutrymmet . Du måste antingen deklarera det eller använda ett jokertecken för prefixet.
Med XML finns det några bästa metoder:
- Var så specifik som möjligt
- Endast navigering framåt
- Viktigt Om skapandet av XML är under din kontroll ändra datum- och tidsformatet till ISO8601. Dina format är kulturspecifika och kan lätt leda till konverteringsfel på olika system. Bäst var ett kombinerat värde som
2017-05-23T12:37:00
För ditt problem finns det flera tillvägagångssätt:
DECLARE @xml XML=
N'<string xmlns="http://www.webserviceX.NET/">
<StockQuotes>
<Stock>
<Symbol>ENGI.PA</Symbol>
<Last>13.53</Last>
<Date>5/23/2017</Date>
<Time>12:37pm</Time>
<!--more elements -->
</Stock>
</StockQuotes>
</string>';
--Bästa tillvägagångssätt:XMLNAMESPACES
för att deklarera standardnamnutrymmet
WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT @xml.value(N'(/string/StockQuotes/Stock/Symbol/text())[1]',N'nvarchar(max)');
--Implicit namnområdesdeklaration:
SELECT @xml.value(N'declare namespace ns="http://www.webserviceX.NET/";
(/ns:string/ns:StockQuotes/ns:Stock/ns:Symbol/text())[1]',N'nvarchar(max)');
--Rekommenderas inte i de flesta fall, men bra för lata människor :-D
SELECT @xml.value(N'(//*:Symbol)[1]',N'nvarchar(max)');
--Om du vill läsa fler värden på samma nivå kan du använda .nodes
för att ställa in den aktuella noden till ...
WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT st.value('(Symbol/text())[1]',N'nvarchar(max)')
,st.value('(Last/text())[1]',N'decimal(10,4)')
--more nodes
FROM @xml.nodes(N'/string/StockQuotes/Stock') AS A(st);