Удобочитаемый вывод RSS
Сделал получение rss с нвостных сайтов и вывод их в консоль пока что.
Все никак не получается победить вывод. Упорно выводится все одной сплошной портянкой. Только на lenta.ru rss разделяется если добавить в него \n(правда при добавлении данных в html шаблон переносы снова теряются, но это уж другая тема) в остальных rss одна портянка.
Подскажите плз, как сделать вывод нормальным и понятным человеку и приятным глазу?
package main
import (
"bufio"
"encoding/xml"
"fmt"
"io"
"log"
"net/http"
"os"
)
type General struct {
Rss xml.Name `xml:"rss"`
Channls []LevelOne `xml:"channel"`
}
type LevelOne struct {
Channel xml.Name `xml:"channel"`
Itms []ItemStruct `xml:"item"`
}
type ItemStruct struct {
It xml.Name `xml:"item"`
Description string `xml:"description"`
//нужное поле достаточно раскомментировать, чтобы оно попало в вывод
/* Guid string `xml:"guid"`
Author string `xml:"author"`
Title string `xml:"title"`*/
//Link string `xml:"link"`
}
func main() {
args := os.Args[1:]
var text string
for i := 0; i < len(args); i++ {
resp := DoingAll(args[i])
scanner := bufio.NewScanner(resp)
for scanner.Scan() {
//ниже добавлен \n для переносов, но он игнорируется. Не игнорируется только если получать rss от lenta.ru
text += scanner.Text() + "\n"
}
var res General
xml.Unmarshal([]byte(text), &res)
fmt.Println(res.Channls)
}
}
func CompositeReq(source string) *http.Request {
req, err := http.NewRequest(http.MethodGet, source, nil)
if err != nil {
log.Fatal(err)
}
return req
}
func MakeReq(req *http.Request) *http.Response {
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
return resp
}
func DoingAll(arg string) io.ReadCloser {
req := CompositeReq(arg)
resp := MakeReq(req)
return resp.Body
}
Ответы (1 шт):
поправляем структуры
type ItemStruct struct {
It xml.Name `xml:"item"`
Description string `xml:"description"`
Guid string `xml:"guid"`
Author string `xml:"author"`
Title string `xml:"title"`
Link string `xml:"link"`
}
просто раскомментировал
type General struct {
Rss xml.Name `xml:"rss"`
Channls LevelOne `xml:"channel"`
}
там нет массива.
Теперь можно исправить чтение
for scanner.Scan() {
text += scanner.Text()
}
теперь можно вывести заголовки
xml.Unmarshal([]byte(text), &res)
for _, item := range res.Channls.Itms {
fmt.Println(item.Title)
}
ок, выведем прям для html
xml.Unmarshal([]byte(text), &res)
for _, item := range res.Channls.Itms {
fmt.Printf("<h1> %s </h1>\n", item.Title)
fmt.Printf("<p> %s </p>\n", item.Description)
}
конечно, там нужно добавить head и body, но даже сейчас уже норм. Но если это чуточку больше, чем для домашнего использования, можно использовать шаблонизаторы, например, встроенный https://metanit.com/go/web/2.1.php