Анализ XML-ответа, предоставленного API Bing в SQL Server 2014 - PullRequest
0 голосов
/ 26 июня 2019

Я использую SQL Server 2014, и я вызываю API матрицы расстояний Bing, чтобы получить расстояние между двумя координатами длиной в лат, и мне удалось получить вывод XML из API.Проблема в том, что я не могу проанализировать XML для получения значения в теге TravelDistance.Как мне разобрать ответ от API?

Я пытался использовать встроенную функцию OPENXML.Я получил NULL-ответ.

Я произвел ответ в виде XML и попытался:

Set @XML=CAST(@response AS XML)

Set @distance=@XML.value('(Response/ResourceSets/ResourceSet/Resources/Resource/Result/Distance/TravelDistance)[1]', 'varchar(20)')

, что привело к NULL-ответу.

Но выбор @XML даст мнеполный ответ

Пример ответа XML находится по этой ссылке: https://docs.microsoft.com/en-us/bingmaps/rest-services/examples/distance-matrix-example

Ответы [ 2 ]

2 голосов
/ 26 июня 2019

XML использует пространства имен, так что вам нужно это сделать.

with xmlnamespaces(default 'http://schemas.microsoft.com/search/local/ws/rest/v1')
select @XML.value('(Response/ResourceSets/ResourceSet/Resources/Resource/Results/Distance/TravelDistance)[1]', 'varchar(20)');

И у вас была опечатка в выражении XQuery.

declare @XML xml = '<?xml version="1.0" encoding="utf-8"?>
<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1">
  <Copyright>Copyright © 2017 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.</Copyright>
  <BrandLogoUri>http://dev.virtualearth.net/Branding/logo_powered_by.png</BrandLogoUri>
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
  <TraceId>9eaa7048e9cc457c804c15bac083d8b7|BN20220145|7.7.0.0|</TraceId>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
      <Resources>
        <Resource xsi:type="DistanceMatrix">
          <Origins>
            <Coordinate>
              <Latitude>47.6044</Latitude>
              <Longitude>-122.3345</Longitude>
            </Coordinate>
            <Coordinate>
              <Latitude>47.6731</Latitude>
              <Longitude>-122.1185</Longitude>
            </Coordinate>
            <Coordinate>
              <Latitude>47.6149</Latitude>
              <Longitude>-122.1936</Longitude>
            </Coordinate>
          </Origins>
          <Destinations>
            <Coordinate>
              <Latitude>45.5347</Latitude>
              <Longitude>-122.6231</Longitude>
            </Coordinate>
            <Coordinate>
              <Latitude>47.4747</Latitude>
              <Longitude>-122.2057</Longitude>
            </Coordinate>
          </Destinations>
          <Results>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>0</OriginIndex>
              <DestinationIndex>0</DestinationIndex>
              <TravelDistance>281.261777777778</TravelDistance>
              <TravelDuration>9560.7</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>0</OriginIndex>
              <DestinationIndex>1</DestinationIndex>
              <TravelDistance>23.284</TravelDistance>
              <TravelDuration>931.5</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>1</OriginIndex>
              <DestinationIndex>0</DestinationIndex>
              <TravelDistance>296.074722222222</TravelDistance>
              <TravelDuration>10203.1</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>1</OriginIndex>
              <DestinationIndex>1</DestinationIndex>
              <TravelDistance>28.4669444444444</TravelDistance>
              <TravelDuration>1155.6</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>2</OriginIndex>
              <DestinationIndex>0</DestinationIndex>
              <TravelDistance>285.752194444444</TravelDistance>
              <TravelDuration>9818.4</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>2</OriginIndex>
              <DestinationIndex>1</DestinationIndex>
              <TravelDistance>18.1444166666667</TravelDistance>
              <TravelDuration>770.9</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
          </Results>
        </Resource>
      </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>';


with xmlnamespaces(default 'http://schemas.microsoft.com/search/local/ws/rest/v1')
select @XML.value('(Response/ResourceSets/ResourceSet/Resources/Resource/Results/Distance/TravelDistance)[1]', 'varchar(20)');
0 голосов
/ 26 июня 2019

Из того, что я могу сказать в своем тесте, парсеру не нравятся символы авторского права в строке 3

Попробуйте это:

declare @xml xml 

set @xml = convert(xml,
replace('<?xml version="1.0" encoding="utf-8"?>
<Response xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/search/local/ws/rest/v1">
  <Copyright>Copyright © 2017 Microsoft and its suppliers. All rights reserved. This API cannot be accessed and the content and any results may not be used, reproduced or transmitted in any manner without express written permission from Microsoft Corporation.</Copyright>
  <BrandLogoUri>http://dev.virtualearth.net/Branding/logo_powered_by.png</BrandLogoUri>
  <StatusCode>200</StatusCode>
  <StatusDescription>OK</StatusDescription>
  <AuthenticationResultCode>ValidCredentials</AuthenticationResultCode>
  <TraceId>9eaa7048e9cc457c804c15bac083d8b7|BN20220145|7.7.0.0|</TraceId>
  <ResourceSets>
    <ResourceSet>
      <EstimatedTotal>1</EstimatedTotal>
      <Resources>
        <Resource xsi:type="DistanceMatrix">
          <Origins>
            <Coordinate>
              <Latitude>47.6044</Latitude>
              <Longitude>-122.3345</Longitude>
            </Coordinate>
            <Coordinate>
              <Latitude>47.6731</Latitude>
              <Longitude>-122.1185</Longitude>
            </Coordinate>
            <Coordinate>
              <Latitude>47.6149</Latitude>
              <Longitude>-122.1936</Longitude>
            </Coordinate>
          </Origins>
          <Destinations>
            <Coordinate>
              <Latitude>45.5347</Latitude>
              <Longitude>-122.6231</Longitude>
            </Coordinate>
            <Coordinate>
              <Latitude>47.4747</Latitude>
              <Longitude>-122.2057</Longitude>
            </Coordinate>
          </Destinations>
          <Results>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>0</OriginIndex>
              <DestinationIndex>0</DestinationIndex>
              <TravelDistance>281.261777777778</TravelDistance>
              <TravelDuration>9560.7</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>0</OriginIndex>
              <DestinationIndex>1</DestinationIndex>
              <TravelDistance>23.284</TravelDistance>
              <TravelDuration>931.5</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>1</OriginIndex>
              <DestinationIndex>0</DestinationIndex>
              <TravelDistance>296.074722222222</TravelDistance>
              <TravelDuration>10203.1</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>1</OriginIndex>
              <DestinationIndex>1</DestinationIndex>
              <TravelDistance>28.4669444444444</TravelDistance>
              <TravelDuration>1155.6</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>2</OriginIndex>
              <DestinationIndex>0</DestinationIndex>
              <TravelDistance>285.752194444444</TravelDistance>
              <TravelDuration>9818.4</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
            <Distance>
              <DepartureTime xsi:nil="true" />
              <OriginIndex>2</OriginIndex>
              <DestinationIndex>1</DestinationIndex>
              <TravelDistance>18.1444166666667</TravelDistance>
              <TravelDuration>770.9</TravelDuration>
              <TotalWalkDuration>0</TotalWalkDuration>
            </Distance>
          </Results>
        </Resource>
      </Resources>
    </ResourceSet>
  </ResourceSets>
</Response>','©',''))

select @xml

Попробуйте удалить это, затем приведите к XMLкажется, работает для меня

...