2015-06-08 76 views
2

我試圖沿着解析XML內容與XML元素的這樣如何使用Go獲取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"` 

回答

2

最根本的問題是,解組XML您struct Node不起作用。您的BodyElements捕獲您的根節點的全部內容,並且沒有任何內容被編組到您的Nodes。 (順便說一句:添加一個簡單的fmt.Printf會透露這一點。)

爲什麼你會嘗試編寫自己的XML解組/代碼?你會失敗。 只需使用解碼器和Token方法手動解析您的XML,一個標記在另一個之後,手動填充樹。並且:如果您的XML實際上是HTML,您可能需要使用軟件包html解析它。

相關問題