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 に答える