2013-02-13 125 views
3

我只是无法得到这个简单的工作。我只是想解析一个简单的RSS XML,并将所有项目放在一个结构数组中。用Go解析xml,有多个项目

这是我的代码:

package main 

import (
    "fmt" 
    "io/ioutil" 
    "log" 
    "net/http" 
    "encoding/xml" 
) 

type RSS struct { 
    XMLName xml.Name `xml:"rss"` 
    items Items `xml:"channel"` 
} 
type Items struct { 
    XMLName xml.Name `xml:"channel"` 
    ItemList []Item `xml:"item"` 
} 
type Item struct { 
    title string `xml:"title"` 
    link string 
    description string 
} 

func main() { 
    res, err := http.Get("http://news.google.com/news?hl=en&gl=us&q=samsung&um=1&ie=UTF-8&output=rss") 
    if err != nil { 
     log.Fatal(err) 
    } 
    asText, err := ioutil.ReadAll(res.Body) 
    if err != nil { 
     log.Fatal(err) 
    } 

    var i RSS 
    err = xml.Unmarshal([]byte(asText), &i) 
    if err != nil { 
     log.Fatal(err) 
    } 

// fmt.Printf("\ttxt2: %s\n", asText) 
    fmt.Printf("%#v", i) 

    for c, item := range i.items.ItemList { 
     fmt.Printf("\t%d: %s\n", c, item.title) 
    } 

    res.Body.Close() 

} 

这是倾倒i的输出:

main.RSS{XMLName:xml.Name{Space:"", Local:"rss"}, items:main.Items{XMLName:xml.Name{Space:"", Local:""}, ItemList:[]main.Item(nil)}} 

回答

7

Unmarshal文档:

由于解组使用反映包,它只能分配给导出的(大写)字段。 Unmarshal使用区分大小写的比较来将XML元素名称与标记值和结构字段名称进行匹配。

所以你需要大写你的结构字段名称。不幸的是,它们不再匹配XML元素名称,所以你必须重复它们的小写版本。

这里的工作示例与你的RSS源的前两个项目:http://play.golang.org/p/jIV_DoCEfq

+0

你是对的,谢谢! – 2013-02-13 15:01:25

+0

非常感谢!它解决了我的问题,以及:) – dezza 2013-08-29 17:46:29