package arpansagovau import ( "encoding/xml" "fmt" "io" "net/http" ) type Stations struct { XMLName xml.Name `xml:"stations"` Text string `xml:",chardata"` Location []struct { Text string `xml:",chardata"` ID string `xml:"id,attr"` Name string `xml:"name"` // adl, ali, bri, can, cas, ... Index float32 `xml:"index"` // 0.0, 0.0, 0.0, 0.0, 0.0, ... Time string `xml:"time"` // 7:24 PM, 7:24 PM, 7:54 PM... Date string `xml:"date"` // 29/08/2019, 29/08/2019, 2... Fulldate string `xml:"fulldate"` // Thursday, 29 August 2019,... Utcdatetime string `xml:"utcdatetime"` // 2019/08/29 09:54, 2019/08... Status string `xml:"status"` // ok, ok, ok, ok, ok, ok, o... } `xml:"location"` } type location struct { name string index float32 time string date string status string } func GetLocationData(cityname string) (*location, error) { var locdata location resp, err := apiRequest() if err != nil { return nil, err } stations, err := parseXML(resp.Body) if err != nil { return nil, err } for _, city := range stations.Location { if city.ID == cityname { locdata = location{name: city.ID, index: city.Index, time: city.Time, date: city.Date, status: city.Status} break } } return &locdata, err } /* -------------------- Unexported Functions -------------------- */ func apiRequest() (*http.Response, error) { req, err := http.NewRequest("GET", "https://uvdata.arpansa.gov.au/xml/uvvalues.xml", nil) if err != nil { return nil, err } httpClient := &http.Client{} resp, err := httpClient.Do(req) if err != nil { return nil, err } if resp.StatusCode != 200 { return nil, fmt.Errorf(resp.Status) } return resp, nil } func parseXML(text io.Reader) (Stations, error) { dec := xml.NewDecoder(text) dec.Strict = false var v Stations err := dec.Decode(&v) return v, err }