xml Anda menyertakan namespace xmlns="http://www.webserviceX.NET/"
, yang merupakan ruang nama default . Anda harus mendeklarasikannya atau menggunakan karakter pengganti untuk awalan.
Dengan XML ada beberapa praktik terbaik:
- Bersikaplah sespesifik mungkin
- Hanya navigasi maju
- Penting Jika pembuatan XML berada di bawah kendali Anda, ubah format tanggal dan waktu menjadi ISO8601. Format Anda bersifat spesifik budaya dan dapat dengan mudah menyebabkan kesalahan konversi pada sistem yang berbeda. Yang terbaik adalah nilai gabungan seperti
<DateAndTime>2017-05-23T12:37:00</DateAndTime>
Untuk masalah Anda, ada beberapa pendekatan:
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>';
--Pendekatan terbaik:XMLNAMESPACES
untuk mendeklarasikan ruang nama default
WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT @xml.value(N'(/string/StockQuotes/Stock/Symbol/text())[1]',N'nvarchar(max)');
--Deklarasi namespace implisit:
SELECT @xml.value(N'declare namespace ns="http://www.webserviceX.NET/";
(/ns:string/ns:StockQuotes/ns:Stock/ns:Symbol/text())[1]',N'nvarchar(max)');
--Tidak direkomendasikan dalam banyak kasus, tapi bagus untuk orang malas :-D
SELECT @xml.value(N'(//*:Symbol)[1]',N'nvarchar(max)');
--Jika Anda ingin membaca lebih banyak nilai pada level yang sama, Anda dapat menggunakan .nodes
untuk mengatur simpul saat ini ke ...<Stock>
.
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);