当前位置: 首页 > 面试题库 >

如何使用Golang解码Reddit的RSS?

傅经业
2023-03-14
问题内容

我一直在玩Go的XML包,看不到以下代码有什么问题。

package main

import (
    "encoding/xml"
    "fmt"
    "net/http"
)

type Channel struct {
    Items Item
}

type Item struct {
    Title       string `xml:"title"`
    Link        string `xml:"link"`
    Description string `xml:"description"`
}

func main() {

    var items = new(Channel)
    res, err := http.Get("http://www.reddit.com/r/google.xml")

    if err != nil {
        fmt.Printf("Error: %v\n", err)
    } else {
        decoded := xml.NewDecoder(res.Body)

        err = decoded.Decode(items)

        if err != nil {
            fmt.Printf("Error: %v\n", err)
        }

        fmt.Printf("Title: %s\n", items.Items.Title)
    }
}

上面的代码运行无误,并打印到终端:

Title:

该结构似乎是空的,但是我看不到为什么它没有填充XML数据。


问题答案:

您的程序接近完成,但是需要指定更多上下文来匹配XML文档。

您需要修改字段标签,以帮助指导XML绑定贯穿您的 Channel结构到您的Item结构:

type Channel struct {
    Items []Item `xml:"channel>item"`
}

type Item struct {
    Title       string `xml:"title"`
    Link        string `xml:"link"`
    Description string `xml:"description"`
}

根据的文档encoding/xml.Unmarshal(),第七项在此处适用:

如果XML元素包含名称与格式为“ a”或“ a> b>
c”的标记的前缀匹配的子元素,则unmarshal将下降到XML结构中以查找具有给定名称的元素,并将其映射该结构字段的最里面的元素。以“>”开头的标记等效于以字段名称后跟“>”开头的标记。

在您的情况下,您希望遍历顶级<rss>元素的<channel>元素以找到每个<item>元素。但是请注意,我们不需要(实际上不需要)通过将字段的标签写为Channel来指定结构应钻入顶层<rss>元素Items

`xml:"rss>channel>item"`

该上下文是隐式的;提供的结构Unmarshall()已经映射到顶级XML元素。

还要注意,您的Channel结构的Items字段应该是slice-of-类型的Item,而不仅仅是single Item

您提到您在使提案生效方面遇到困难。这是一份完整的清单,我发现可以正常使用:

package main

import (
    "encoding/html" target="_blank">xml"
    "fmt"
    "net/http"
    "os"
)

type Channel struct {
    Items []Item `xml:"channel>item"`
}

type Item struct {
    Title       string `xml:"title"`
    Link        string `xml:"link"`
    Description string `xml:"description"`
}

func main() {
    if res, err := http.Get("http://www.reddit.com/r/google.xml"); err != nil {
        fmt.Println("Error retrieving resource:", err)
        os.Exit(1)
    } else {
        channel := Channel{}
        if err := xml.NewDecoder(res.Body).Decode(&channel); err != nil {
            fmt.Println("Error:", err)
            os.Exit(1)
        } else if len(channel.Items) != 0 {
            item := channel.Items[0]
            fmt.Println("First title:", item.Title)
            fmt.Println("First link:", item.Link)
            fmt.Println("First description:", item.Description)
        }
    }
}


 类似资料:
  • 问题内容: 我一直试图从PubNub解析此JSON消息,但没有任何运气: 有没有人知道如何在golang中解码这种复杂类型? 问题答案: 简短的答案是,您不能直接将非同类型的JSON数组(按您的示例)解组到golang结构中。 长答案是,您应该为PubNubMessage类型定义一个方法,该方法将JSON字符串解组为an ,然后使用类型断言来确保所需的格式并填充结构。 例如:

  • 遍历文件夹,包括子目录 以下是简化的代码: 报错: undefined: walkFn 我不清楚如何定义一个正确的walkFn, 请问应该如何修改呢? 谢谢

  • 我一直在查看praw的文档,但我根本找不到哪种方法可以查看所有帖子。我想做的是浏览所有帖子 格式有点错误,我间隔了4次并粘贴,但它仍然不起作用。

  • 我在我的应用程序中使用带Spring Boot的KeyClope。我的浏览器客户端请求keydepot生成JWT,然后将此JWT发送到我的ZUUL服务器,该服务器使用keydeport-spring适配器验证JWT,然后我编写了一个预过滤器来解码JWT负载并提取用户名。我正在使用com。auth0。java jwt库来解码jwt,如下面的代码片段所示 我想知道是否有什么方法可以不用使用外部库就可以

  • 问题内容: 我必须使用(相对)标准的围棋程序go.net/websocket库。我正在尝试从网页中接收和解码消息,这些消息对于每种消息类型都具有不同的结构,即 有什么方法可以对消息进行“部分”解码,仅在继续将实际消息解码为go结构之前检查该字段? 这是否有必要编写一个自定义a’la ,以将其委托给消息本身的JSON编解码器? 问题答案: 使用json.RawMessage延迟解码,例如 是一个别名

  • 这是 reddit 官方网站的历史源代码。