How to parse an XML document in Go

This example shows how to fetch and parse an XML feed with Go. Save this in main_test.go: ```go package main import ( "bytes" "code.google.com/p/go-charset/charset" _ "code.google.com/p/go-charset/data" // Import charset configuration files "encoding/xml" "io/ioutil" "log" "net/http" "testing" ) type RssFeed struct { XMLName xml.Name `xml:"rss"` Items []RssItem `xml:"channel>item"` } type RssItem struct { XMLName xml.Name `xml:"item"` Title string `xml:"title"` Link string `xml:"link"` Description string `xml:"description"` //NestedTag string xml:">nested>tags>" } func fetchURL(url string) []byte { resp, err := http.Get(url) if err != nil { log.Fatalf("unable to GET '%s': %s", url, err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatalf("unable to read body '%s': %s", url, err) } return body } func parseXML(xmlDoc []byte, target interface{}) { reader := bytes.NewReader(xmlDoc) decoder := xml.NewDecoder(reader) // Fixes "xml: encoding \"windows-1252\" declared but Decoder.CharsetReader is nil" decoder.CharsetReader = charset.NewReader if err := decoder.Decode(target); err != nil { log.Fatalf("unable to parse XML '%s':\n%s", err, xmlDoc) } } func TestParseReport(t *testing.T) { var rssFeed = &RssFeed{} xmlDoc := fetchURL("https://news.ycombinator.com/rss") parseXML(xmlDoc, &rssFeed) for _, item := range rssFeed.Items { log.Printf("%s: %s", item.Title, item.Link) } } ``` Run the code with **go test**.