我对xml
结构没有经验,需要一个起点来说明如何从xml
结构中检索值。
我使用xml
从webservice
获取stored-procedure
并存储到表格" StockInfoXML"
包含xml
的表格中的字段是 {1}}的 XML_Url 。
xml
我已经尝试了几件事情,但继续<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>
<Change>+0.06</Change>
<Open>13.45</Open>
<High>13.59</High>
<Low>13.40</Low>
<Volume>1524437</Volume>
<MktCap>32.95B</MktCap>
<PreviousClose>13.47</PreviousClose>
<PercentageChange>+0.48%</PercentageChange>
<AnnRange>10.77 - 15.20</AnnRange>
<Earns>-0.23</Earns>
<P-E>N/A</P-E>
<Name>ENGIE</Name>
</Stock>
</StockQuotes>
</string>
或者什么都没有。
null
任何能让我入手的人? 感谢。
答案 0 :(得分:3)
您的xml包含一个名称空间xmlns="http://www.webserviceX.NET/"
,它是默认名称空间。您必须声明它或使用通配符作为前缀。
使用XML有一些最佳实践:
<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)');
- 在大多数情况下不推荐,但对懒人有好处:-D
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);
答案 1 :(得分:1)
您必须在获取值
之前为xml设置名称空间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>
<Change>+0.06</Change>
<Open>13.45</Open>
<High>13.59</High>
<Low>13.40</Low>
<Volume>1524437</Volume>
<MktCap>32.95B</MktCap>
<PreviousClose>13.47</PreviousClose>
<PercentageChange>+0.48%</PercentageChange>
<AnnRange>10.77 - 15.20</AnnRange>
<Earns>-0.23</Earns>
<P-E>N/A</P-E>
<Name>ENGIE</Name>
</Stock>
</StockQuotes>
</string>'
;WITH XMLNAMESPACES('http://www.webserviceX.NET/' as ns)
SELECT
x.s.value('(./ns:Symbol)[1]', 'varchar(50)') AS [Symbol]
FROM @xml.nodes('/ns:string/ns:StockQuotes/ns:Stock') AS x(s);
返回
Symbol
--------
ENGI.PA