1

大家好,正如标题所说,我正在使用 API 按国家和城市获取天气信息。一切正常,正在返回输出。但是当我尝试将 varchar 转换为 xml 时,我遇到了问题。

看看我的代码和输出:

Declare @Object as Int;
Declare @ResponseText as Varchar(8000) ;
DECLARE @XML XML;

Exec sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
Exec sp_OAMethod @Object, 'open', NULL, 'get', 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Stockholm&CountryName=Sweden', 'false'
Exec sp_OAMethod @Object, 'send'
Exec sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT 

select @ResponseText
set @xml = cast(@ResponseText as xml);
select @XML

输出:

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://www.webserviceX.NET">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;CurrentWeather&gt;
  &lt;Location&gt;Stockholm / Bromma, Sweden (ESSB) 59-21N 017-57E 14M&lt;/Location&gt;
  &lt;Time&gt;Nov 12, 2013 - 04:20 PM EST / 2013.11.12 2120 UTC&lt;/Time&gt;
  &lt;Wind&gt; from the SW (220 degrees) at 10 MPH (9 KT):0&lt;/Wind&gt;
  &lt;SkyConditions&gt; partly cloudy&lt;/SkyConditions&gt;
  &lt;Temperature&gt; 44 F (7 C)&lt;/Temperature&gt;
  &lt;DewPoint&gt; 41 F (5 C)&lt;/DewPoint&gt;
  &lt;RelativeHumidity&gt; 87%&lt;/RelativeHumidity&gt;
  &lt;Pressure&gt; 29.83 in. Hg (1010 hPa)&lt;/Pressure&gt;
  &lt;Status&gt;Success&lt;/Status&gt;
&lt;/CurrentWeather&gt;</string>

被铸造的:

<string xmlns="http://www.webserviceX.NET">&lt;?xml version="1.0" encoding="utf-16"?&gt;
&lt;CurrentWeather&gt;
  &lt;Location&gt;Stockholm / Bromma, Sweden (ESSB) 59-21N 017-57E 14M&lt;/Location&gt;
  &lt;Time&gt;Nov 12, 2013 - 04:20 PM EST / 2013.11.12 2120 UTC&lt;/Time&gt;
  &lt;Wind&gt; from the SW (220 degrees) at 10 MPH (9 KT):0&lt;/Wind&gt;
  &lt;SkyConditions&gt; partly cloudy&lt;/SkyConditions&gt;
  &lt;Temperature&gt; 44 F (7 C)&lt;/Temperature&gt;
  &lt;DewPoint&gt; 41 F (5 C)&lt;/DewPoint&gt;
  &lt;RelativeHumidity&gt; 87%&lt;/RelativeHumidity&gt;
  &lt;Pressure&gt; 29.83 in. Hg (1010 hPa)&lt;/Pressure&gt;
  &lt;Status&gt;Success&lt;/Status&gt;
&lt;/CurrentWeather&gt;</string>

首先,我不能返回:&gt;s and &lt;s as < >?其次,我认为这里发生的事情是<?xml ..... ?>正在改变地方并且破坏了xml。

以及如何将第一个输出转换为有效的 XML?

编辑:我通过添加解决了这个问题:

set @ResponseText = replace(replace(replace(@ResponseText,'&gt;','>'),'&lt;','<'),'<?xml version="1.0" encoding="utf-16"?>
','');

但我仍然想知道,有没有更好的方法?

4

1 回答 1

3

您可以尝试使用 xml 数据类型的 .value 方法来取消 xml 的实体化,例如这对我有用:

DECLARE @Object AS INT;
DECLARE @ResponseText AS VARCHAR(8000) ;
DECLARE @XML XML;

EXEC sp_OACreate 'MSXML2.XMLHTTP', @Object OUT;
EXEC sp_OAMethod @Object, 'open', NULL, 'get', 'http://www.webservicex.net/globalweather.asmx/GetWeather?CityName=Stockholm&CountryName=Sweden', 'false'
EXEC sp_OAMethod @Object, 'send'
EXEC sp_OAMethod @Object, 'responseText', @ResponseText OUTPUT 

SELECT CAST( @ResponseText AS XML ).value('.', 'VARCHAR(MAX)') rt
SET @xml = CAST( @ResponseText AS XML ).value('.', 'NVARCHAR(MAX)') 
SELECT @xml
于 2013-11-13T01:26:42.457 回答