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

时间:2015-06-08 08:26:22

标签: go

我正在尝试解析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.我可以做什么来获取给定元素中的所有属性。注意:属性名称不是常量,因为有时元素可以是&#34; div&#34;标签或&#34; img&#34;标签或其他东西。所以我不能将属性名称用作

DataId string `xml:"data-id,attr"`

1 个答案:

答案 0 :(得分:2)

根本问题是将XML解组到struct Node不起作用。您的BodyElements会抓取您的根节点的整个内容,并且没有任何内容被解组到您的Nodes。 (顺便说一下:添加一个简单的fmt.Printf会显示出来。)

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