2013-06-25 25 views
0

下面是我的示例代碼Google API在指定的經緯度位置拋出異常?

public static string GetGeoLoc(string latitude, string longitude, 
     out string Address_ShortCountryName, 
     out string Address_country, 
     out string Address_administrative_area_level_1, 
     out string Address_administrative_area_level_1_short_name, 
     out string Address_administrative_area_level_2, 
     out string Address_administrative_area_level_3, 
     out string Address_colloquial_area, 
     out string Address_locality, 
     out string Address_sublocality, 
     out string Address_neighborhood) 
    { 
     Address_ShortCountryName = ""; 
     Address_country = ""; 
     Address_administrative_area_level_1 = ""; 
     Address_administrative_area_level_1_short_name = ""; 
     Address_administrative_area_level_2 = ""; 
     Address_administrative_area_level_3 = ""; 
     Address_colloquial_area = ""; 
     Address_locality = ""; 
     Address_sublocality = ""; 
     Address_neighborhood = ""; 

     XmlDocument doc = new XmlDocument(); 

     try 
     { 
      doc.Load("http://maps.googleapis.com/maps/api/geocode/xml?latlng=" + latitude + "," + longitude + "&sensor=false"); 
      XmlNode element = doc.SelectSingleNode("//GeocodeResponse/status"); 
      if (element.InnerText == "ZERO_RESULTS") 
      { 
       return ("No data available for the specified location"); 
      } 
      else 
      { 

       element = doc.SelectSingleNode("//GeocodeResponse/result/formatted_address"); 

       string longname = ""; 
       string shortname = ""; 
       string typename = ""; 


       XmlNodeList xnList = doc.SelectNodes("//GeocodeResponse/result/address_component"); 
       foreach (XmlNode xn in xnList) 
       { 
        try 
        { 
         longname = xn["long_name"].InnerText; 
         shortname = xn["short_name"].InnerText; 
         typename = xn["type"].InnerText; 

         switch (typename) 
         { 
          case "country": 
           { 
            Address_country = longname; 
            Address_ShortCountryName = shortname; 
            break; 
           } 

          case "locality": 
           { 
            Address_locality = longname; 
            break; 
           } 

          case "sublocality": 
           { 
            Address_sublocality = longname; 
            break; 
           } 

          case "neighborhood": 
           { 
            Address_neighborhood = longname; 
            break; 
           } 

          case "colloquial_area": 
           { 
            Address_colloquial_area = longname; 
            break; 
           } 

          case "administrative_area_level_1": 
           { 
            Address_administrative_area_level_1 = longname; 
            Address_administrative_area_level_1_short_name = shortname; 
            break; 
           } 

          case "administrative_area_level_2": 
           { 
            Address_administrative_area_level_2 = longname; 
            break; 
           } 

          case "administrative_area_level_3": 
           { 
            Address_administrative_area_level_3 = longname; 
            break; 
           } 

          default: 
           break; 
         } 
        } 

        catch (Exception e) 
        { 
         clsExHandler.Instance.Write(e); 
        } 
       } 
       return (element.InnerText); 
      } 

     } 
     catch (Exception ex) 
     { 
      return ("(Address lookup failed:) " + ex.Message); 
     } 
    } 

嘗試通過緯度33.4965 &經度-112.205

我在行得到一個例外對象引用無效的對象

**typename = xn["type"].InnerText;** 

時我一步一步調試沒有像[「類型」]這樣的屬性

也有索姆其他語言性格爲什麼?

我該如何解決這個問題。

回答

0

我不熟悉c#,我不知道你的代碼是否正確(例如類型不是屬性,它是一個elementNode)。

假設你的代碼是正確的,你可以通過使用node['nameOfChildNode'],當你檢查XML的文件中選擇節點:http://maps.googleapis.com/maps/api/geocode/xml?latlng=33.4965,-112.205&sensor=false,你會看到有2 <type>的address_components也address_components沒有任何<type>

我想你的代碼不會丟失<type>,當你嘗試訪問缺失的<type>的屬性(InnerText)時,它會中斷。

你可以做些什麼:使用selectSingleNode選擇<type>,當它返回時null執行回退或留下進一步處理。

+0

是的,我確實接受該類型是一個元素節點,我也使用'SelectSingleNode'只讀取我上面的示例代碼。 –

+0

但是'xn [「type」]',這就是我們所說的,你不在那裏使用'SelectSingleNode'。但是,當這種符號是C#中'SelectSingleNode'的有效簡寫時,這不是問題。訪問http://maps.googleapis.com/maps/api/geocode/xml?latlng=33.4965,-112.205&sensor=false,您會看到1個結果,其中address_component沒有子節點'' (向下滾動一點點,結果就是......我猜日語字符是'USA,Arizona,フェニックス=メサ=スコッツデール',而這個結果的第一個''沒有類型,這是問題) –

0

http://maps.googleapis.com/maps/api/geocode/json?latlng=33.4965%20,%20-112.205&sensor=false

回報

{ 
    "results" : [], 
    "status" : "ZERO_RESULTS" 
} 

因此

XmlNode element = doc.SelectSingleNode("//GeocodeResponse/status"); 
      if (element.InnerText == "ZERO_RESULTS") 
      { 
       return ("No data available for the specified location"); 
      } 

沒有趕上ZERO_RESULTS

我對C#不熟悉,所以我不能進一步幫助。

+0

請求的網址是http://maps.googleapis.com/maps/api/geocode/xml?latlng=33.4965,-112.205&sensor=false –

相關問題