implement atom
This commit is contained in:
77
parser/parser.go
Normal file
77
parser/parser.go
Normal file
@ -0,0 +1,77 @@
|
||||
package parser
|
||||
|
||||
import (
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type FeedType string
|
||||
|
||||
const (
|
||||
Rss FeedType = "rss"
|
||||
Atom FeedType = "atom"
|
||||
)
|
||||
|
||||
type FeedEntry struct {
|
||||
Link string
|
||||
Content string
|
||||
}
|
||||
|
||||
func ParseFeed(feedType FeedType, data []byte) ([]FeedEntry, error) {
|
||||
switch feedType {
|
||||
case Rss:
|
||||
return parseRss(data)
|
||||
case Atom:
|
||||
return parseAtom(data)
|
||||
}
|
||||
return nil, fmt.Errorf("Unknown feed type: %s", feedType)
|
||||
}
|
||||
|
||||
func parseAtom(data []byte) ([]FeedEntry, error) {
|
||||
v := struct {
|
||||
Items []struct {
|
||||
Link struct {
|
||||
Href string `xml:"href,attr"`
|
||||
} `xml:"link"`
|
||||
Content string `xml:",innerxml"`
|
||||
} `xml:"entry"`
|
||||
}{}
|
||||
|
||||
err := xml.Unmarshal(data, &v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var feedEntries []FeedEntry
|
||||
for _, atomEntry := range v.Items {
|
||||
feedEntries = append(feedEntries, FeedEntry{
|
||||
Link: atomEntry.Link.Href,
|
||||
Content: atomEntry.Content,
|
||||
})
|
||||
}
|
||||
return feedEntries, nil
|
||||
}
|
||||
func parseRss(data []byte) ([]FeedEntry, error) {
|
||||
|
||||
v := struct {
|
||||
Items []struct {
|
||||
Link string `xml:"link"`
|
||||
Content string `xml:",innerxml"`
|
||||
} `xml:"channel>item"`
|
||||
}{}
|
||||
|
||||
err := xml.Unmarshal(data, &v)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var feedEntries []FeedEntry
|
||||
for _, rssEntry := range v.Items {
|
||||
feedEntries = append(feedEntries, FeedEntry{
|
||||
Link: rssEntry.Link,
|
||||
Content: rssEntry.Content,
|
||||
})
|
||||
}
|
||||
|
||||
return feedEntries, nil
|
||||
}
|
Reference in New Issue
Block a user