2015-12-29 4 views
2

Я использую следующий код в Excel, чтобы вернуть расстояние между двумя точками (Origin and Destination).Расстояние чтения xml узел (расстояние) - Google Maps api - Delphi 6

Есть ли аналогичный способ сделать это в Delphi 6?

Я нашел несколько примеров в Интернете, но все функции, которые не существуют в Delphi 6, возможно, потому что они очень старые. Например, IHTMLDocument2, который Delphi 6 не распознает.

Function Km_Distance(Origin As String, Destination As String) As Double  
    Dim myRequest As XMLHTTP 
    Dim myDomDoc As DOMDocument 
    Dim distanceNode As IXMLDOMNode 

    Let Km_Distance = 0 

    On Error GoTo exitRoute 

    Let Origin = Replace(Origin, " ", "%20") 
    Let Destination = Replace(Destination, " ", "%20")   

    Set myRequest = New XMLHTTP 

    myRequest.Open "GET", "http://maps.googleapis.com/maps/api/directions/xml?origin=" _ 
     & Origin & "&destination=" & Destination & "&sensor=false", False 
    myRequest.send 

    Set myDomDoc = New DOMDocument 

    myDomDoc.LoadXML myRequest.responseText 

    Set distanceNode = myDomDoc.SelectSingleNode("//leg/distance/value") 
    If Not distanceNode Is Nothing Then Km_Distance = distanceNode.Text/1000 

exitRoute: 
    Set distanceNode = Nothing 
    Set myDomDoc = Nothing 
    Set myRequest = Nothing 
End Function 

Я могу прочитать xml, возвращенный API (код ниже).

Вопрос сейчас: как читать расстояние в этом xml на Delphi? Эквивалент: Set distanceNode = myDomDoc.SelectSingleNode ("// ножка/расстояние/значение")

procedure TForm1.Button3Click(Sender: TObject); 
var 
    vXMLDoc: TXMLDocument; 
    NodeRec: IXMLNode; 
    aasdlkj : IXMLDocument; 
    XMLFile: String; 
begin 

XMLFile:= 'http://maps.googleapis.com/maps/api/directions/xml?origin=Curitiba&destination=Joinville'; 
vXMLDoc := TXMLDocument.Create(self); 
vXMLDoc.LoadFromFile(XMLFile); //Le Arquivo xml selecionado 

Memo1.Clear; 
Memo1.Lines.Add(vXMLDoc.XML.Text); 

How to do this? 
//NodeRec= vXMLDoc.SelectSingleNode("//leg/distance/value") 

if not vXMLDoc.Active Then 
exit; 
end; 
+0

«IHTMLDocument2 .. Delphi 6 не распознает» Это будет, если вы правильно настроили проект. IHTMLDocument2 является одним из нескольких интерфейсов, определенных в модуле MSHTML.Pas, который поставляется с Delphi (у меня нет D6, но он определенно был с D5). Вам нужно добавить MSHTML в список Uses вашего кода Delphi (и, возможно, добавить к нему путь к настройкам вашего проекта). – MartynA

ответ

1

следующие работы для меня:

Uses ... MSXML, UrlMon, ... 

function TForm1.GetURL : String; 
var 
    Origin, 
    Destination, 
    URL : String; 
begin 
    Origin := StringReplace(edOrigin.Text, ' ', '#20', [rfReplaceAll]); 
    Destination := StringReplace(edDestination.Text, ' ', '#20', [rfReplaceAll]); 
    Result := GoogleMapsURL + '&origin=' + Origin + '&destination=' + Destination 
    + '&sensor=false'; 
end; 

procedure TForm1.GetXML; 
var 
    XMLDoc: IXMLDOMDocument; 
    Node : IXMLDomNode; 
    XMLUrl : String; 
    XMLFileName: String; 
begin 

XMLUrl := GetUrl; 

XMLFileName := 'C:\temp\temp.xml'; 

URLDownloadToFile(Nil, PChar(XMLUrl), PChar(XMLFileName), 0, Nil); 

Memo1.Lines.LoadFromFile(XMLFileName); 

XMLDoc := CoDOMDocument.Create; 
XMLDoc.LoadXML(Memo1.Lines.Text); 
Node := XMLDoc.SelectSingleNode('//leg/distance/value'); 

Memo1.Lines.Add(Node.Text); 
end; 

Я использовал URLDownloadToFile для загрузки XML, потому что по какой-то причине XMLDoc.Load(GetURL) возвращает пустой XML-документ. Я также попытался загрузить URL-адрес в TWebBrowser, но моя попытка восстановить интерфейс IHtmlDocument2 также не удалась. Являются ли эти проблемы конкретными для URL-адресов googlemaps, я не знаю - обычно они (XMLDoc.Load и интерфейс IHtlmDocument2 TWebBrowser) работают нормально.

Update: Кажется, что трудности у меня был с помощью XMLDoc.Load, чтобы получить XML из URL GoogleMaps потому, что блок импорта MSXML я использую это устареет. Следующие работы на Windows10 64-бит и избегают необходимости использовать URLDownloadToFile (хотя на самом деле я предпочитаю использовать это, потому что тогда у меня есть XML прямо передо мной).

procedure TForm1.GetXML2; 
var 
    XMLDoc: IXMLDOMDocument; 
    Node : IXMLDomNode; 
    XMLUrl : String; 
    XMLFileName: String; 
begin 
XMLDoc := CreateOleObject('Msxml2.DOMDocument.6.0') as IXMLDOMDocument; 
XMLDoc.async := False; 

XMLUrl := GetUrl; 
if not XMLDoc.load(XMLUrl) then 
    exit; 

Assert(XMLDoc.DocumentElement <> nil); 

Node := XMLDoc.SelectSingleNode('//leg/distance/value'); 

Memo1.Lines.Add(Node.Text); 

end; 
+0

На моем Delphi 6, показывает: Необъявленный идентификатор: «IXMLDOMDocument» Необъявленный идентификатор: «IXMLDomNode» Необходимо добавить дополнительные ссылки на «uses»? – user3771516

+0

См. Update re Uses – MartynA

+0

Большое вам спасибо. Он работал хорошо. Мне просто нужно внести некоторые коррективы в свое дело, но это то, что мне нужно. – user3771516

Смежные вопросы