आपके एक्सएमएल में एक नाम स्थान शामिल है xmlns="http://www.webserviceX.NET/"
, जो कि डिफ़ॉल्ट नाम स्थान . है . आपको या तो इसे घोषित करना होगा या उपसर्ग के लिए वाइल्डकार्ड का उपयोग करना होगा।
XML के साथ कुछ सर्वोत्तम प्रथाएं हैं:
- जितना संभव हो उतना विशिष्ट रहें
- केवल अग्रेषित नेविगेशन
- महत्वपूर्ण यदि XML का निर्माण आपके नियंत्रण में है, तो दिनांक और समय प्रारूप को ISO8601 में बदलें। आपके प्रारूप संस्कृति विशिष्ट हैं और आसानी से विभिन्न प्रणालियों पर रूपांतरण त्रुटियों का कारण बन सकते हैं। सबसे अच्छा एक संयुक्त मूल्य था जैसे
<DateAndTime>2017-05-23T12:37:00</DateAndTime>
आपकी समस्या के लिए कई तरीके हैं:
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>';
--सर्वश्रेष्ठ तरीका:XMLNAMESPACES
डिफ़ॉल्ट नामस्थान . घोषित करने के लिए
WITH XMLNAMESPACES(DEFAULT 'http://www.webserviceX.NET/')
SELECT @xml.value(N'(/string/StockQuotes/Stock/Symbol/text())[1]',N'nvarchar(max)');
- लागू नाम स्थान घोषणा:
SELECT @xml.value(N'declare namespace ns="http://www.webserviceX.NET/";
(/ns:string/ns:StockQuotes/ns:Stock/ns:Symbol/text())[1]',N'nvarchar(max)');
--ज्यादातर मामलों में अनुशंसित नहीं, लेकिन आलसी लोगों . के लिए अच्छा है :-डी
SELECT @xml.value(N'(//*:Symbol)[1]',N'nvarchar(max)');
--यदि आप समान स्तर के अधिक मान पढ़ना चाहते हैं, तो आप .nodes
. का उपयोग कर सकते हैं वर्तमान नोड को ...<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);