为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 Go 获取 XML 元素的所有属性?

如何使用 Go 获取 XML 元素的所有属性?

Go
繁花如伊 2021-10-11 18:43:04
我正在尝试解析 xml 内容以及这样的 XML 元素的所有属性type Node struct {  XMLName xml.Name  Attributes []xml.Attr `xml:",attr"`  BodyElements string `xml:",innerxml"`  Nodes   []Node `xml:",any"`}var xmldata = []byte("<div><div data-id=\"images/6C7161080\" data-imagesize=\"medium\" data-alignment=\"none\"></div></div>")func walk(nodes []Node, f func(Node) bool) {  for _, n := range nodes {    if f(n) {        walk(n.Nodes, f)    }  }}func main() {  buf := bytes.NewBuffer(xmldata)  dec := xml.NewDecoder(buf)  var n Node  err := dec.Decode(&n)  if err != nil {    panic(err)  }  walk([]Node{n}, func(n Node) bool {    if n.XMLName.Local == "p" {        fmt.Println(string(n.BodyElements))    } else if n.XMLName.Local == "div"{        fmt.Println(string(n.BodyElements))        fmt.Println(len(n.Attributes))    }    return true  })}但是 len(n.Attributes) 的值始终为 0。我该怎么做才能获取给定元素中的所有属性。注意:属性名称不是恒定的,因为有时元素可以是“div”标签或“img”标签或其他东西。所以我不能使用属性名称作为DataId string `xml:"data-id,attr"`
查看完整描述

1 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

根本的问题是,将 XML 解组到您的文件中struct Node是行不通的。您BodyElements捕获了根节点的全部内容,并且没有任何内容被解组到您的Nodes. (顺便说一句:添加一个简单的 fmt.Printf 会揭示这一点。)

为什么要尝试编写自己的 XML 解组/解析代码?你会失败。只需使用解码器和Token方法手动解析您的 XML,一个接一个的标记,手动填充您的树。并且:如果您的 XML 实际上是 HTML,您可能想用包 html 解析它。


查看完整回答
反对 回复 2021-10-11
  • 1 回答
  • 0 关注
  • 286 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信