Google API - XML Output Formats i xPath :-)   strona główna:
A po co ten Excel ;-)
 
 
   Jaki jest "minus" wykorzystania obiektu JSON w Google API? Wg mnie format zwracanych danych :-) Choć, kto jak kto ale ja, nie  
będę krytykował Wyrażeń Regularnych bo można dzięki nimi naprawdę wiele i uzyskiwane wyniki są pewne to jednak, jak by kto tego  
nie nazwał to "wygrzebywanie" danych z ciągu tekstowego. Co byłoby łatwiejsze i pewniejsze, a zarazem prostsze niż składnia  
Reg.Exp??   
   Jak się okazuje wykorzystanie obiektu JSON to nie jedyny sposób pozyskiwania danych przez Google API. :-)   Google Maps API Web Services
Drugim sposobem pozyskiwania danych jest XML Output Formats. Zobaczcie czym się to różni od JSON i jak czytać dane z niego  
zwracane.  
  The Google Geocoding API
XML Output Formats
Różnica w ciągu strURL jest minimalna - np. dla geocode:  
 
    strURL = "http://maps.googleapis.com/maps/api/geocode/json?" & _  
             "address=" & Encode(address) & _  
             "&language=pl-PL" & _  
             "&sensor=true"  
 
    strURL = "http://maps.googleapis.com/maps/api/geocode/xml?" & _  
             "address=" & Encode(address) & _  
             "&language=pl-PL" & _  
             "&sensor=true"  
 
i tyle :-) Cała reszta parametrów, dla tego jak i innych zapytań, jest dosłownie taka sama :-)  
ale to co zwraca przeglądarka czy Microsoft.XMLHTTP jest już zupełnie inne niż JSON..  
dla adresu: "Środkowa 1, Białka Tatrzańska" zwraca takie dane, w takim formacie:  
 
This XML file does not appear to have any style information associated with it. The document tree is shown below.  
<GeocodeResponse>  
<status>OK</status>  
<result>  
<type>street_address</type>  
<formatted_address>Środkowa 1, 34-405 Białka Tatrzańska, Polska</formatted_address>  
<address_component>  
<long_name>1</long_name>  
<short_name>1</short_name>  
<type>street_number</type>  
</address_component>  
<address_component>  
<long_name>Środkowa</long_name>  
<short_name>Środkowa</short_name>  
<type>route</type>  
</address_component>  
<address_component>  
<long_name>Białka Tatrzańska</long_name>  
<short_name>Białka Tatrzańska</short_name>  
<type>locality</type>  
<type>political</type>  
</address_component>  
<address_component>  
<long_name>Bukowina Tatrzańska</long_name>  
<short_name>Bukowina Tatrzańska</short_name>  
<type>administrative_area_level_3</type>  
<type>political</type>  
</address_component>  
<address_component>  
<long_name>tatrzański</long_name>  
<short_name>tatrzański</short_name>  
<type>administrative_area_level_2</type>  
<type>political</type>  
</address_component>  
<address_component>  
<long_name>Województwo małopolskie</long_name>  
<short_name>Województwo małopolskie</short_name>  
<type>administrative_area_level_1</type>  
<type>political</type>  
</address_component>  
<address_component>  
<long_name>Polska</long_name>  
<short_name>PL</short_name>  
<type>country</type>  
<type>political</type>  
</address_component>  
<address_component>  
<long_name>34-405</long_name>  
<short_name>34-405</short_name>  
<type>postal_code</type>  
</address_component>  
<geometry>  
<location>  
<lat>49.3740961</lat>  
<lng>20.1128285</lng>  
</location>  
<location_type>ROOFTOP</location_type>  
<viewport>  
<southwest>  
<lat>49.3727471</lat>  
<lng>20.1114795</lng>  
</southwest>  
<northeast>  
<lat>49.3754451</lat>  
<lng>20.1141775</lng>  
</northeast>  
</viewport>  
</geometry>  
</result>  
</GeocodeResponse>  
 
spytacie: Czemu to jest lepsze od tego co zwraca JSON?? Ano dlatego że w plikach xml można odczytywać dane - właściwości pól  
poprzez XPATH :-)   XPath Tutorial
a więc procedura:  
  Loop through XML File using VBA and xPath
Option Explicit  
 
Function InfoAdministracyjne_xPath()   How To Use XPath Queries in MSXML DOM selectNodes Method
    Dim arrXMLRequest As Variant, i As Integer  
 
       MSXML 3.0 Supports XPath 1.0, XSLT 1.0, XDR, and SAX2
    arrXMLRequest = GeoCode("Środkowa 1, Białka Tatrzańska", _  
                             "//GeocodeResponse/result/address_component/long_name")  
                               
    If IsArray(arrXMLRequest) Then  
        For i = LBound(arrXMLRequest) To UBound(arrXMLRequest)  
            Debug.Print arrXMLRequest(i)  
        Next  
    End If  
          
End Function  
 
Function GeoCode(ByVal address As String, xPath As String) As Variant  
    On Error GoTo GeoCode_Error  
    Dim msXML As Object  
    Dim strURL As String  
    Dim tbl() As String, i As Integer: i = 1  
      
'--------------The Google Geocoding API---------------------  
'https://developers.google.com/maps/documentation/geocoding/  
 
'----------------XML Output Formats------------------------  
'http://maps.googleapis.com/maps/api/geocode/xml? _  
    address=1600+Amphitheatre+Parkway,+Mountain+View,+CA& _  
    sensor=true_or_false  
      
    strURL = "http://maps.googleapis.com/maps/api/geocode/xml?" & _  
             "address=" & Encode(address) & _  
             "&language=pl-PL" & _  
             "&sensor=true"  
      
    Dim xmlDoc As Object 'MSXML2.DOMDocument  
    Dim oRoot As Object 'MSXML2.IXMLDOMNode  
    Dim colNodes As Object 'MSXML2.IXMLDOMNodeList  
    Dim oNode As Object 'MSXML2.IXMLDOMNode  
      
    Set xmlDoc = CreateObject("MSXML2.DOMDocument")  
                      
    Set msXML = CreateObject("Microsoft.xmlHTTP")  
    With msXML  
        .Open "GET", strURL, False  
        .send  
    End With  
      
    With xmlDoc  
        .LoadXML msXML.responseText  
        Set oRoot = .DocumentElement  
        Set colNodes = oRoot.SelectNodes(xPath)  
        ReDim tbl(1 To colNodes.Length)  
          
        For Each oNode In colNodes  
            tbl(i) = oNode.nodeTypedValue  
            i = i + 1  
        Next  
    End With  
      
    GeoCode = tbl  
      
GeoCode_Exit:  
    Set oNode = Nothing  
    Set colNodes = Nothing  
    Set xmlDoc = Nothing  
    Set oRoot = Nothing  
    Set msXML = Nothing  
    Exit Function  
 
GeoCode_Error:  
    MsgBox "Unexpected error - " & Err.Number & vbCrLf & vbCrLf & _  
            Error$, vbExclamation, "VBAProject - ReaXML"  
    Resume GeoCode_Exit  
 
End Function  
 
Function Encode(ByVal strText As String) As String  
    Dim objScrContr As Object  
    '------------Percent-encoding---------------  
    'http://en.wikipedia.org/wiki/URL_encoding  
                      
    'JavaScript encodeURIComponent() Function  
    'http://www.w3schools.com/jsref/jsref_encodeuricomponent.asp  
                      
    Set objScrContr = VBA.CreateObject("MSScriptControl.ScriptControl")  
    With objScrContr  
        .Language = "JavaScript"  
        .AddCode "function encode(str) {" & _  
                    "return encodeURIComponent(str);" & _  
                 "}"   przykład do pobrania:
        Encode = .Run("encode", strText)   GoogleAPI xml.zip
    End With  
    Set objScrContr = Nothing  
End Function  
 
zwróci:  
 
 
 
 
 
 
 
 
 
 
                                                                                    ...haaaaaaaaaaaaaaa nie fajne :-))))))  
chcecie lokalizację tego adresu:  
 
    arrXMLRequest = GeoCode("Środkowa 1, Białka Tatrzańska", _  
                             "//GeocodeResponse/result/geometry/location/lat") 'lng  
 
 
 Ja byłem zachwycony..  Mam nadzieję że Wam też się spodobało i może nawet się przyda :-P