当前位置: 首页 > 知识库问答 >
问题:

golang 解析rss并返回json?

裴畅
2024-12-03
<rss>
    <channel>
    <title>RSS</title>
    <item>
        <title>23333</title>
        <my:size>7.8 MiB</my:size>
    </item>
    </channel>
</rss>
type RSS struct {
    Channel Channel `xml:"channel"`
}

type Channel struct {
    Title       string `xml:"title"`
    Items       []Item `xml:"item"`
}

type Item struct {
    Title string `xml:"title"`
    Size  string `xml:"my:size"`
}

func rss(w http.ResponseWriter, r *http.Request) {
    var rss RSS
    err = xml.Unmarshal([]byte(rss_str), &rss)
    if err != nil {
        fmt.Printf("解析 XML 失败: %s\n", err)
        return
    }
    jsonData, err := json.MarshalIndent(rss, "", "  ")
    if err != nil {
        fmt.Printf("转换为 JSON 失败: %s\n", err)
        return
    }

    w.Write(jsonData)
}

就这个 my:size 很难办,我无法正确解析,得到的内容为空

目前我是用

rss_str := strings.ReplaceAll(rss_str, "my:", "")

凑活的,能满足我要求,但总感觉不是个事儿。

请问,该怎么解析带命名空间的xml?
谢谢

共有2个答案

颛孙镜
2024-12-03

go代码

package main

import (
    "encoding/json"
    "encoding/xml"
    "fmt"
    "strings"
)

type RSS struct {
    Channel Channel `xml:"channel"`
}

type Channel struct {
    Title string `xml:"title"`
    Items []Item `xml:"item"`
}

type Item struct {
    Title string `xml:"title"`
    Size  string `xml:"size"`
}

func main() {
    rssStr := `<rss>
    <channel>
        <title>RSS</title>
        <item>
            <title>23333</title>
            <my:size xmlns:my="http://example.com/my">7.8 MiB</my:size>
        </item>
    </channel>
</rss>`

    var rss RSS
    decoder := xml.NewDecoder(strings.NewReader(rssStr))
    var currentElement string

    for {
        token, err := decoder.Token()
        if err != nil {
            break
        }
        switch element := token.(type) {
        case xml.StartElement:
            currentElement = element.Name.Local
            if element.Name.Space == "http://example.com/my" && currentElement == "size" {
                var size string
                decoder.DecodeElement(&size, &element)
                rss.Channel.Items = append(rss.Channel.Items, Item{Size: size})
            }
        case xml.EndElement:
            currentElement = ""
        case xml.CharData:
            if currentElement == "title" {
                rss.Channel.Items = append(rss.Channel.Items, Item{Title: string(element)})
            }
        }
    }

    jsonData, err := json.MarshalIndent(rss, "", "  ")
    if err != nil {
        fmt.Printf("转换为 JSON 失败: %s\n", err)
        return
    }

    fmt.Println(string(jsonData))
}

输出JSON

{
  "Channel": {
    "Title": "",
    "Items": [
      {
        "Title": "23333",
        "Size": "7.8 MiB"
      }
    ]
  }
}
孔鸿宝
2024-12-03
要解析带有命名空间的 XML,你需要在结构体字段的标签中指定该命名空间。在 Go 的 `encoding/xml` 包中,你可以通过在 XML 标签中使用 `xmlns` 属性来指定命名空间。

以下是如何修改你的结构体以正确解析带有命名空间的 `my:size` 字段:

type RSS struct {

Channel Channel `xml:"channel"`

}

type Channel struct {

XMLName xml.Name `xml:"channel"`
Title   string   `xml:"title"`
Items   []Item   `xml:"item"`

}

type Item struct {

Title string `xml:"title"`
Size  string `xml:"my:size" xmlns:my="http://example.com/my"`  // 假设命名空间 URI 为 http://example.com/my

}

func rss(w http.ResponseWriter, r *http.Request) {

// 假设 rss_str 是你的 RSS XML 字符串
var rss RSS
err := xml.Unmarshal([]byte(rss_str), &rss)
if err != nil {
    fmt.Printf("解析 XML 失败: %s\n", err)
    return
}
jsonData, err := json.MarshalIndent(rss, "", "  ")
if err != nil {
    fmt.Printf("转换为 JSON 失败: %s\n", err)
    return
}

w.Header().Set("Content-Type", "application/json")
w.Write(jsonData)

}


请注意,你需要将 `xmlns:my` 的值替换为实际的命名空间 URI。这个 URI 应该在你的 RSS XML 文档的顶部或相关部分定义。如果你没有该命名空间的 URI,你可能需要联系 RSS 数据的提供者以获取正确的 URI。

此外,确保在 HTTP 响应中设置正确的 `Content-Type` 头,以便客户端知道返回的是 JSON 数据。
 类似资料:
  • 我正在从Go中的YAML输入创建一个文档生成器。它需要指定每个项目/节点是从YAML文件的哪一行生成的。有没有办法在Go中实现? 例如,这是一个YAML文件 我希望看到以下内容 我看到一个类似的问题回答了Python解析YAML,返回行号,但我不知道如何利用https://pkg.go.dev/gopkg.in/yaml.v3

  • 问题内容: 我创建了一个自定义错误类型来包装错误,以便更轻松地在Golang中进行调试。当有打印错误时它可以工作,但是现在引起了恐慌。 演示版 当我调用一个函数时,它不会返回错误,我仍然应该能够包装该错误。 预期的行为是,如果错误为nil,则应该简单地忽略它,不幸的是,它会做相反的事情。 我希望它能打印出来。而是即使错误为nil也会打印。 问题答案: 正在将err变量与nil进行比较,但实际上它是

  • 问题内容: 我有像 由Web服务器呈现为HTML。我需要将这些字符串转换为 当前,这就是我正在做的事情(借助于jQuery): 但是我有一种不安的感觉,我做错了。我努力了 但它似乎无效,decodeURI / decodeURIComponent也无效。 还有其他更自然,更优雅的方式吗? 问题答案: 用于从JavaScript解释HTML(文本和其他形式)的一个更现代的选项是API中的HTML支持

  • 问题内容: 场景:我正在尝试解析一个XML结构,但我不知道如何在xml属性值包含文本和更多嵌套值的情况下建立结构。所有其他属性都已正确设置,我不确定是否需要获取源的值并创建一个单独的解析器来检索元素的值。 编辑: 我正在尝试将源解析为以下形式的字符串:你好%{first_name}%{last_name} 用当前结构解组xml字符串将返回一个空结构 使用innerxml的@plato将源设置为:

  • 问题内容: 我一直在玩Go的XML包,看不到以下代码有什么问题。 上面的代码运行无误,并打印到终端: 该结构似乎是空的,但是我看不到为什么它没有填充XML数据。 问题答案: 您的程序接近完成,但是需要指定更多上下文来匹配XML文档。 您需要修改字段标签,以帮助指导XML绑定贯穿您的 结构到您的结构: 根据的文档,第七项在此处适用: 如果XML元素包含名称与格式为“ a”或“ a> b> c”的标记

  • 我正在尝试使用Go语言向我的(magento)网络服务器发出请求。 我设法发出了一个POST请求,但是,我没有得到与从cmd使用CURL时相同的响应。我关注了这篇文章(如何在Golang中获取JSON响应),它没有给我任何响应。 所以我试了这个 这只是像这样返回http响应 当使用< code > curl-g-X POST " my . dev/index . PHP/rest/V1/guest

  • 问题内容: 我想要一个带字符串并返回一个数组的Python函数,该数组中的每个项目都是字符,或者是这种类型的另一个数组。嵌套数组在输入字符串中以’(’开始,以’)’结尾。 因此,该函数将如下所示: 注意:我更喜欢纯功能的解决方案。 问题答案: 和,

  • 我显然误解了jspromise的解决方式或“返回”的语义 我被一个期望我是同步的函数调用——返回一个值。计算该值需要一些异步代码(特别是dstore集合上的ForEach方法) 我试图实现的大致是这个,但这不起作用,因为函数mySynchronousFunction没有返回值。 我知道JS必须允许单线程实现,所以阻止它并不酷,但必须有某种模式用于将异步代码粘合到同步代码,我刚刚错过了这种模式。