Seite 1 von 3

Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 17:21
von smateja
Hallo zusammen,

ich möchte mir ein kleines eigenes Gadget bauen, welches lediglich als Grafik und ein wenig Text das Wetter als Bild darstellt.

Das Anzeigen und die Grafiken sollten kein Problem darstellen - allerdings habe ich noch keinen Ansatz z. B. Wetterdaten von einer Website auszulesen (idealerweise auch vorhersagen etc.) und diese dann zu verwerten.

Hat hier evtl. jemand einen Ansatz oder Ideen bzw. sowas schon mal versucht?

LG der Stef

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 17:25
von smateja
Nachtrag: Okay - hab just kurz nach dem Post direkt was zum Thema gefunden - das geheimniss nennt sich Wetter API wie es z. B. google anbietet.

Diese Website enthält schon mal gar nicht so verkehrte Ansätze:

http://www.web-spirit.de/webdesign-tuto ... eather-API

Wer natürlich was brauchbares in PB als Code liefert ist immer willkommen :)

LG der Stef

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 17:28
von STARGÅTE
Naja dieser Link liefert dir ja ein XML-Baum.

Das hießt für PB:

Link-Zusammenstellen
Runterladen
Mit XML-Paser die einzelnen Daten lesen
im gadget darstellen

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 17:33
von smateja
Jups, dank google chrome ging da erstmal nix - FF brachte dann das XML.

Das schon mal n recht guter Ansatz. Die Frage ist - man müsste das doch ohne zwischenspeichern auch On The Fly auslesen können?

Evtl. eine Idee how-to?

Thx a Lot


PS: Sind immer wieder die gleichen 5 Leute die einem hier weiterhelfen - Muss euch mal für eure Dauer-Unterstützung loben. Ohne euch schaut glaub der PB Support auf dauer echt n bizzi mau aus.

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 17:38
von Bisonte
Ich hatte mir dafür schonmal was zurechtgebastelt, was mir igoogle ausliest und parst...
Lädt auch die Wetter Icons herunter (im png format wie für PB gemacht ;) )

Ist wie gesagt vorab gebastelt gewesen, also noch nicht EnableExplicit geeicht .... und lässt sich wahrscheinlich auch eleganter lösen ;)

Code: Alles auswählen

;###############################################################################
;##### 
;##### Google Wetterdaten 
;##### 
;###############################################################################

UsePNGImageDecoder()

Structure weather_data
  Celsius.i
  Fahrenheit.i
  Datum.s
  Condition_Text.s
  LuftFeuchte.i
  Wind_Text.s
  Image.i
EndStructure
Procedure.i iGoogle_Weather(Location.s, Path.s, Map Weather_Data.weather_data(), Language.s = "de")
  
  Url.s = "http://www.google.com/ig/api?weather=" + Location + "&hl=" + Language

  ClearMap(Weather_Data())

  If ReceiveHTTPFile(Url,Path + "wet.txt")
    Nr = ReadFile(#PB_Any,Path + "wet.txt")
    If Nr
      res.s = ReadString(Nr)
      CloseFile(Nr)
    EndIf
  EndIf
  DeleteFile(Path + "wet.txt")

  If res <> ""
    
    With Weather_Data(Location)
      
      Anz = CountString(res,">")
      Dim XML.s(Anz)
      
      For i=1 To Anz
        XML(i) = StringField(res,i,">")+">"
      Next i    
      
      For i=1 To Anz
        
        String.s = XML(i)
        
        If d=0
          If FindString(String,LCase("current_date_time data"),1)
            TempString.s = StringField(String,2,Chr(34))
            Datum = ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", TempString)
            d = 1
            \Datum = FormatDate("%dd.%mm.%yyyy - %hh:%ii:%ss",Datum)
          EndIf
        EndIf  
        If c=0
          If FindString(String,LCase("condition data"),1)
            \Condition_Text = StringField(String,2,Chr(34))
            c = 1
          EndIf
        EndIf      
        If a=0
          If FindString(String,LCase("temp_c data"),1)
            \Celsius = Val(StringField(String,2,Chr(34)))
            a = 1
          EndIf
        EndIf
        If b=0
          If FindString(String,LCase("temp_f data"),1)
            \Fahrenheit = Val(StringField(String,2,Chr(34)))
            b = 1
          EndIf          
        EndIf 
        If h=0
          If FindString(String,LCase("humidity data"),1)
            \LuftFeuchte = Val(RemoveString(StringField(String,2,":"),"%"))
            h=1
          EndIf
        EndIf  
        If Not IsImage(Image)
          If FindString(String,LCase("icon data"),1)
            ImageUrl.s = "http://img0.gmodules.com"+StringField(XML(i),2,Chr(34))
            ImageUrl = Left(ImageUrl,Len(ImageUrl)-3) + "png"
            If ReceiveHTTPFile(ImageUrl,Path + "weather.png")
              \Image = LoadImage(#PB_Any,Path + "weather.png")
              Image = \Image
              If IsImage(Image)
                DeleteFile(Path + "weather.png")
              EndIf
            EndIf             
          EndIf
        EndIf  
        If w=0
          If FindString(String,LCase("wind_condition data"),1)
            w=1
            \Wind_Text = Trim(RemoveString(StringField(String,2,":"),Chr(34)+"/>"))
          EndIf
        EndIf                 
        
      Next i  

    EndWith
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
  
EndProcedure

;##### Beispiel

InitNetwork()

  NewMap Wetter.weather_data()
  
  Image = CreateImage(#PB_Any,40,40)
  
  Location.s = "Hamburg"
  
  If iGoogle_Weather(Location, GetTemporaryDirectory(), Wetter())
    
    OpenWindow(0,0,0,300,100,"Wetter : "+Location,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
    
    If IsImage(Wetter(Location)\Image)
      ImageGadget(0,10,10,40,40,ImageID(Wetter(Location)\Image))
    EndIf
    TextGadget(1,55,10,250,15,Wetter(Location)\Condition_Text)    
    TextGadget(2,55,25,250,15,Str(Wetter(Location)\Celsius) + " Grad Celsius bei "+Str(Wetter(Location)\LuftFeuchte)+"% Luftfeuchtigkeit")
    TextGadget(3,55,40,250,15,"Wind aus "+Wetter(Location)\Wind_Text)
    Repeat
      Event = WaitWindowEvent()
      
      If Event = #PB_Event_CloseWindow
        Quit = 1
      EndIf
      
      
    Until Quit = 1
    
  EndIf


Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 17:40
von STARGÅTE
also Ohne zwischen Speichern gehts mit TS-Softs code: ReceiveHTTPMemory()

Code: Alles auswählen

Procedure.i ReceiveHTTPMemory(URL.s, BufferSize = 4096, Timeout = 5000)
  Protected Connection, Time, Time2, Event, Size, Size2, SizeAll, pos
  Protected.s Server
  Protected *Mem, *Buffer, *Mem2
  Size = 1

  If LCase(Left(URL, 7)) <> "http://" : URL = "http://" + URL : EndIf
  Server = GetURLPart(URL, #PB_URL_Site)
  If Not Server : ProcedureReturn #False : EndIf
  Connection = OpenNetworkConnection(Server, 80, #PB_Network_TCP)
  If Not Connection : ProcedureReturn #False : EndIf
  If BufferSize <= 0 : BufferSize = 4096 : EndIf
  *Buffer = AllocateMemory(BufferSize)
  If Not *Buffer : ProcedureReturn #False : EndIf

  SendNetworkString(Connection, "GET " + URL + " HTTP/1.0" + #LFCR$ + #LFCR$)
  Time = ElapsedMilliseconds()
  Repeat
    Event = NetworkClientEvent(Connection)
    If Event = #PB_NetworkEvent_Data
      Repeat
        Size = ReceiveNetworkData(Connection, *Buffer, BufferSize)
        If Size > 0
          Time = ElapsedMilliseconds()
          SizeAll + Size
          *Mem = ReAllocateMemory(*Mem, SizeAll)
          If *Mem
            CopyMemory(*Buffer, *Mem + (SizeAll - Size), Size)
          Else
            CloseNetworkConnection(Connection)
            FreeMemory(*Buffer)
            ProcedureReturn #False
          EndIf
        EndIf
      Until Size <= 0
    EndIf
    Time2 = ElapsedMilliseconds() - Time
  Until Time2 > Timeout Or Size <= 0
  CloseNetworkConnection(Connection)
  FreeMemory(*Buffer)
  If Time2 > Timeout
    If *Mem : FreeMemory(*Mem) : EndIf
    ProcedureReturn #False
  EndIf
  pos = FindString(PeekS(*mem, -1, #PB_UTF8), #CRLF$ + #CRLF$, 1) - 1
  pos = Len(#CRLF$ + #CRLF$) + pos
  Size2 = MemorySize(*Mem) - pos
  *Mem2 = AllocateMemory(Size2)
  If *Mem2
    CopyMemory(*Mem + pos, *Mem2, Size2)
    FreeMemory(*Mem)
    ProcedureReturn *Mem2
  EndIf
  FreeMemory(*Mem)
  ProcedureReturn #False
EndProcedure

InitNetwork()
*Adresse = ReceiveHTTPMemory("http://www.google.com/ig/api?weather=Berlin&hl=de")

Debug CatchXML(1, *Adresse, MemorySize(*Adresse))
Ich denke den XML-Rest bekommst du dann selber hin, wenn du die Beispiele der Hilfe anguckst

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 18:03
von Bisonte
ah jetzt weiss ich wieder warum ich das von hand geparst habe...

XMLStatus gab da ne Fehlermeldung raus, und da ich nicht wirklich firm bin, was den XML Teil von PB angeht,
lieber so wie ich es kann, auch wenns merkwürdig aussieht ...

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 18:09
von smateja
Ja Krass - drücke erstmal mehrfach den "Danke sagen" Button an euch Beide.

*THX* *THX* *THX*

:)

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 19:22
von smateja
Ja XML ist glaub auch nicht so ganz meine Stärke:

Code: Alles auswählen



;EnableExplicit

Enumeration

#XML_Wetter
#Window
#TreeGadget

EndEnumeration


Procedure.i Sidebar_Gadget_ReceiveHTTPMemory(URL.s, BufferSize = 4096, Timeout = 2000)
  Protected Connection, Time, Time2, Event, Size, Size2, SizeAll, pos
  Protected.s Server
  Protected *Mem, *Buffer, *Mem2
  Size = 1

  If LCase(Left(URL, 7)) <> "http://" : URL = "http://" + URL : EndIf
  Server = GetURLPart(URL, #PB_URL_Site)
  If Not Server : ProcedureReturn #False : EndIf
  Connection = OpenNetworkConnection(Server, 80, #PB_Network_TCP)
  If Not Connection : ProcedureReturn #False : EndIf
  If BufferSize <= 0 : BufferSize = 4096 : EndIf
  *Buffer = AllocateMemory(BufferSize)
  If Not *Buffer : ProcedureReturn #False : EndIf

  SendNetworkString(Connection, "GET " + URL + " HTTP/1.0" + #LFCR$ + #LFCR$)
  Time = ElapsedMilliseconds()
  Repeat
    Event = NetworkClientEvent(Connection)
    If Event = #PB_NetworkEvent_Data
      Repeat
        Size = ReceiveNetworkData(Connection, *Buffer, BufferSize)
        If Size > 0
          Time = ElapsedMilliseconds()
          SizeAll + Size
          *Mem = ReAllocateMemory(*Mem, SizeAll)
          If *Mem
            CopyMemory(*Buffer, *Mem + (SizeAll - Size), Size)
          Else
            CloseNetworkConnection(Connection)
            FreeMemory(*Buffer)
            ProcedureReturn #False
          EndIf
        EndIf
      Until Size <= 0
    EndIf
    Time2 = ElapsedMilliseconds() - Time
  Until Time2 > Timeout Or Size <= 0
  CloseNetworkConnection(Connection)
  FreeMemory(*Buffer)
  If Time2 > Timeout
    If *Mem : FreeMemory(*Mem) : EndIf
    ProcedureReturn #False
  EndIf
  pos = FindString(PeekS(*mem, -1, #PB_UTF8), #CRLF$ + #CRLF$, 1) - 1
  pos = Len(#CRLF$ + #CRLF$) + pos
  Size2 = MemorySize(*Mem) - pos
  *Mem2 = AllocateMemory(Size2)
  If *Mem2
    CopyMemory(*Mem + pos, *Mem2, Size2)
    FreeMemory(*Mem)
    ProcedureReturn *Mem2
  EndIf
  FreeMemory(*Mem)
  ProcedureReturn #False
EndProcedure

Procedure FillTree(*CurrentNode, CurrentSublevel)

  ; Ignore anything except normal nodes. See the manual for
  ; XMLNodeType() for an explanation of the other node types.
  ;
  If XMLNodeType(*CurrentNode) = #PB_XML_Normal
  
    ; Add this node to the tree. Add name and attributes
    ;
    Text$ = GetXMLNodeName(*CurrentNode) + " (Attributes: "
        
    If ExamineXMLAttributes(*CurrentNode)
      While NextXMLAttribute(*CurrentNode)
        Text$ + XMLAttributeName(*CurrentNode) + "=" + Chr(34) + XMLAttributeValue(*CurrentNode) + Chr(34) + " "
      Wend
    EndIf
    
    Text$ + ")"
    
    AddGadgetItem(#TreeGadget, -1, Text$, 0, CurrentSublevel)
        
        
    ; Now get the first child node (if any)
    ;    
    *ChildNode = ChildXMLNode(*CurrentNode)
    
    ; Loop through all available child nodes and call this procedure again
    ;
    While *ChildNode <> 0
      FillTree(*ChildNode, CurrentSublevel + 1)      
      *ChildNode = NextXMLNode(*ChildNode)
    Wend        
  
  EndIf

EndProcedure


InitNetwork()

Global *Adresse = Sidebar_Gadget_ReceiveHTTPMemory("http://www.google.com/ig/api?weather=Memmingen&hl=de")

CatchXML(#XML_Wetter, *Adresse, MemorySize(*Adresse))



If OpenWindow(#Window, 0, 0, 500, 500, "XML Example", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
      TreeGadget(#TreeGadget, 10, 10, 480, 480)
            ;
      *MainNode = MainXMLNode(#XML_Wetter) 
     
      If *MainNode
        
        FillTree(*MainNode, 0)
      EndIf
      
Repeat
        Event = WaitWindowEvent()
      Until Event = #PB_Event_CloseWindow
EndIf


Leider klemmt hier noch irgendwas und liefert nicht alle Werte die aus dem XML kommen.

Re: Wetterdaten z.B. von Wetter.com auslesen

Verfasst: 21.04.2011 20:31
von Bisonte
Wenn man das mit CatchXML() geholte mit XMLStatus() überprüft, erfüllt es #PB_XML_InvalidToken

Es scheint an einem Umlaut zu liegen (in dem einen Fall das ö von bewölkt)

Die Parameter von CatchXML() sind ja (#XML, *Adresse, Laenge [, Flags [, Kodierung]])

Da hab ich nun mit rumexperimentiert ... und siehe da :

CatchXML(#XML, *Adresse, Laenge , 0 , #PB_Ascii)

und schon wird alles angezeigt (bzw. von deinem Bsp. ausgelesen) wie es sein soll...

Edit :

Ich hab meinen Code von oben ein wenig überarbeitet, Stargates Hinweis übernommen (hier ts-soft sei gedankt) und ein
hoffentlich einwandfreies Include gebastelt, das auch ein Anfänger verstehen könnte (von der Fremdprozedur mal abgesehen ;) )...

Code: Alles auswählen

EnableExplicit

;###############################################################################
;##### 
;##### Benötigte Prozeduren zum Netzwerk Initialisieren und Download2Memory
;##### 
;###############################################################################

Procedure.i NetWorkInit()

  Static Netz
  
  If Netz <> #True
    If InitNetwork() = 0
      Netz = #False
      MessageRequester("Network","No TCP-Stack found !",#MB_ICONSTOP)
      End
    Else
      Netz = #True
    EndIf
  EndIf

  ProcedureReturn Netz 
   
EndProcedure
Procedure.i ReceiveHTTPMemory(URL.s, BufferSize = 4096, Timeout = 5000)
  
  ;##### Original von ts-soft
  
  If NetWorkInit()
    
    Protected Connection, Time, Time2, Event, Size, Size2, SizeAll, pos
    Protected.s Server
    Protected *Mem, *Buffer, *Mem2
    Size = 1
    
    If LCase(Left(URL, 7)) <> "http://" : URL = "http://" + URL : EndIf
    Server = GetURLPart(URL, #PB_URL_Site)
    If Not Server : ProcedureReturn #False : EndIf
    Connection = OpenNetworkConnection(Server, 80, #PB_Network_TCP)
    If Not Connection : ProcedureReturn #False : EndIf
    If BufferSize <= 0 : BufferSize = 4096 : EndIf
    *Buffer = AllocateMemory(BufferSize)
    If Not *Buffer : ProcedureReturn #False : EndIf
    
    SendNetworkString(Connection, "GET " + URL + " HTTP/1.0" + #LFCR$ + #LFCR$)
    Time = ElapsedMilliseconds()
    Repeat
      Event = NetworkClientEvent(Connection)
      If Event = #PB_NetworkEvent_Data
        Repeat
          Size = ReceiveNetworkData(Connection, *Buffer, BufferSize)
          If Size > 0
            Time = ElapsedMilliseconds()
            SizeAll + Size
            *Mem = ReAllocateMemory(*Mem, SizeAll)
            If *Mem
              CopyMemory(*Buffer, *Mem + (SizeAll - Size), Size)
            Else
              CloseNetworkConnection(Connection)
              FreeMemory(*Buffer)
              ProcedureReturn #False
            EndIf
          EndIf
        Until Size <= 0
      EndIf
      Time2 = ElapsedMilliseconds() - Time
    Until Time2 > Timeout Or Size <= 0
    CloseNetworkConnection(Connection)
    FreeMemory(*Buffer)
    If Time2 > Timeout
      If *Mem : FreeMemory(*Mem) : EndIf
      ProcedureReturn #False
    EndIf
    pos = FindString(PeekS(*mem, -1, #PB_UTF8), #CRLF$ + #CRLF$, 1) - 1
    pos = Len(#CRLF$ + #CRLF$) + pos
    Size2 = MemorySize(*Mem) - pos
    *Mem2 = AllocateMemory(Size2)
    If *Mem2
      CopyMemory(*Mem + pos, *Mem2, Size2)
      FreeMemory(*Mem)
      ProcedureReturn *Mem2
    EndIf
    FreeMemory(*Mem)
  EndIf

  ProcedureReturn #False
EndProcedure

;###############################################################################
;##### 
;##### iGoogle Wetterdaten
;##### 
;###############################################################################

UsePNGImageDecoder()

Structure iGoogle_wetter_daten
  
  current_date_time.s
  city.s
  postal_code.s
  Unit_System.s
  
  ccondition.s
  temp_f.i
  temp_c.i
  humidity.i
  cicon.s
  cimage.i
  wind_condition.s
  
  day_of_week.s[5]
  low.i[5]
  high.i[5]
  icon.s[5]
  image.i[5]
  condition.s[5]
  
EndStructure

Global NewMap iGoogle_Weather_Data.iGoogle_wetter_daten()

Procedure.s iGoogle_Weather_ParseData(String.s)
  
  Protected Result.s = ""
  
  Result = Mid(String,FindString(String,Chr(32),1))
  Result = RemoveString(Result,"data=")
  Result = RemoveString(Result,"/>")
  Result = RemoveString(Result,#DQUOTE$)
  Result = Trim(Result)
    
  ProcedureReturn Result
  
EndProcedure
Procedure.s iGoogle_Weather_ParseNode(String.s)
  
  Protected Result.s = ""
  
  Result = StringField(String,1," ")
  Result = RemoveString(Result,"<")
  Result = Trim(Result)
  
  ProcedureReturn Result
  
EndProcedure

Procedure iGoogle_Weather_forecast_information(Location.s, Array XML.s(1), Start,Stop)
  
  Protected Mark.s, Result.s, i.i, Datum.i
  
  With iGoogle_Weather_Data(Location)
    
    For i=Start To Stop
      
      Result.s = iGoogle_Weather_ParseData(xml(i))
      Mark.s   = iGoogle_Weather_ParseNode(xml(i))
      
      Select Mark
        Case "city"
          \city = result
        Case "postal_code"
          \postal_code = result
        Case "current_date_time"
          Datum = ParseDate("%yyyy-%mm-%dd %hh:%ii:%ss", Result)
          \current_date_time = FormatDate("%dd.%mm.%yyyy - %hh:%ii:%ss",Datum)
        Case "unit_system"
          \Unit_System = result
      EndSelect
      
    Next i
    
  EndWith

EndProcedure
Procedure iGoogle_Weather_current_conditions(Location.s, Array XML.s(1), Start,Stop)
  
  Protected Mark.s, Result.s, i.i
  Protected *BildAdresse
  
  With iGoogle_Weather_Data(Location)
    
    For i=Start To Stop
      
      Result.s = iGoogle_Weather_ParseData(xml(i))
      Mark.s   = iGoogle_Weather_ParseNode(xml(i))
      
      Select Mark
          
        Case "condition"
          \ccondition = result
        Case "temp_f"
          \temp_f = Val(result)
        Case "temp_c"
          \temp_c = Val(result)
        Case "humidity"
          result = Trim(RemoveString(StringField(result,2,":"),"%"))
          \humidity = Val(result)
        Case "icon"
          \cicon = "http://img0.gmodules.com"+Result
          *BildAdresse = ReceiveHTTPMemory(Left(\cicon,Len(\cicon)-3) + "png")
          If *BildAdresse
            \cimage = CatchImage(#PB_Any,*BildAdresse)
            FreeMemory(*BildAdresse)
          EndIf
        Case "wind_condition"
          \wind_condition = result
      EndSelect
    Next i  
    
  EndWith

EndProcedure
Procedure iGoogle_Weather_forecast_conditions(Location.s, Array XML.s(1), Tag, Start,Stop)
  
  Protected Mark.s, Result.s, i.i
  Protected *BildAdresse
    
  If Tag <=4
    With iGoogle_Weather_Data(Location)
    For i=Start To Stop
      Result.s = iGoogle_Weather_ParseData(xml(i))
      Mark.s   = iGoogle_Weather_ParseNode(xml(i))
      
      Select Mark
          
        Case "day_of_week"
          \day_of_week[Tag] = Result  
          
        Case "low"
          \low[Tag] = Val(Result) 
          
        Case "high"
          \high[Tag] = Val(Result) 
          
        Case "icon"
          \icon[Tag] = "http://img0.gmodules.com"+Result
          *BildAdresse = ReceiveHTTPMemory(Left(\icon[Tag],Len(\icon[Tag])-3) + "png")
          If *BildAdresse
            \image[Tag] = CatchImage(#PB_Any,*BildAdresse)
            FreeMemory(*BildAdresse)
          EndIf
          
        Case "condition"
          \condition[Tag] = Result 
      EndSelect
      
    Next i 
    EndWith
  
  EndIf
  
EndProcedure

Procedure iGoogle_Weather(Location.s, Language.s = "de")
  
  Protected Url.s = "http://www.google.com/ig/api?weather=" + Location + "&hl=" + Language
  Protected *Adresse = ReceiveHTTPMemory(Url)
  Protected String.s, Anz.i, i.i, Start.i, Stop.i, Nr.i
  
  If *Adresse 
    String.s = PeekS(*Adresse)
    FreeMemory(*Adresse)
  EndIf
  
  If String <> ""
    Anz = CountString(String,">")
    Dim XML.s(Anz)
    
    For i=1 To Anz
      XML(i) = StringField(String,i,">")+">"
    Next i
    
    For i=1 To Anz
      If XML(i) = "<forecast_information>"
        Start = i+1
        Repeat 
          i + 1
        Until XML(i) = "</forecast_information>"
        Stop = i-1
        iGoogle_Weather_forecast_information(Location,xml(),start,stop)
      EndIf
      If XML(i) = "<current_conditions>"
        Start = i+1
        Repeat 
          i + 1
        Until XML(i) = "</current_conditions>"
        Stop = i-1
        iGoogle_Weather_current_conditions(Location,xml(),start,stop)
      EndIf
      If XML(i) = "<forecast_conditions>"
        Start = i+1
        nr + 1
        Repeat 
          i + 1
        Until XML(i) = "</forecast_conditions>"
        Stop = i-1
        iGoogle_Weather_forecast_conditions(Location,xml(),Nr,start,stop)
      EndIf    
    Next i   
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf  
  
EndProcedure

;##### 
;##### Beispiel 
;##### 

Define Location.s, Event.i, Quit.i, i.i

Location.s = "Berlin"

If iGoogle_Weather(Location)
  
  OpenWindow(0,0,0,300,500,"Wetter : "+Location,#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
  
  With iGoogle_Weather_Data(Location)
    
    If IsImage(\cimage)
      ImageGadget(0,10,10,40,40,ImageID(\cimage))
    EndIf
    TextGadget(1,55,10,250,15,\current_date_time) 
    TextGadget(2,55,25,250,15,\ccondition)    
    TextGadget(3,55,40,250,15,Str(\temp_c) + " Grad Celsius bei "+Str(\humidity)+"% Luftfeuchtigkeit")
    TextGadget(4,55,55,250,15,"Wind aus "+\wind_condition)
    
    TextGadget(5,55,90,250,15,"Weitere Vorhersagen :")
    For i=1 To 4
    If IsImage(\cimage)
      ImageGadget(i+5,10,100+(i*50),40,40,ImageID(\image[i]))
    EndIf      
    TextGadget(i+5+4,55,100+(i*50),250,15,\day_of_week[i]+" : "+Str(\low[i])+" | "+Str(\high[i])+" Grad Celsius") 
    TextGadget(i+5+4+4,55,120+(i*50),250,15,\condition[i]) 
    Next i

  EndWith
  
  Repeat
    Event = WaitWindowEvent()
    
    If Event = #PB_Event_CloseWindow
      Quit = 1
    EndIf
    
    
  Until Quit = 1
  
EndIf