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

我正在尝试解析 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"`


繁花如伊
浏览 287回答 1
1回答

Helenr

根本的问题是,将 XML 解组到您的文件中struct Node是行不通的。您BodyElements捕获了根节点的全部内容,并且没有任何内容被解组到您的Nodes.&nbsp;(顺便说一句:添加一个简单的 fmt.Printf 会揭示这一点。)为什么要尝试编写自己的 XML 解组/解析代码?你会失败。只需使用解码器和Token方法手动解析您的 XML,一个接一个的标记,手动填充您的树。并且:如果您的 XML 实际上是 HTML,您可能想用包 html 解析它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go