2017-06-13 42 views
0

我正試圖解組XML。XML unmarshal無法正常工作第一個元素

type XMLCSFP struct { 
    Version string `xml:"version,attr"` 
} 

type XMLCS struct { 
    Container XMLCSFP `xml:"container"` 
} 


v2 := XMLCS{} 
data := ` 
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0"> 
    <rootfiles> 
     <rootfile full-path="EPUB/package.opf" media-type="application/oebps-package+xml"/> 
    </rootfiles> 
</container> 
` 
err = xml.Unmarshal([]byte(data), &v) 
    if err != nil { 
    fmt.Printf("error: %v", err) 
    return 
} 
fmt.Println(v) 

它沒有顯示我的版本1.0。結構的值是nil

但是,當我用div容器包裝xml。它工作正常。

data := ` 
<div> 
<container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0"> 
    <rootfiles> 
     <rootfile full-path="EPUB/package.opf" media-type="application/oebps-package+xml"/> 
    </rootfiles> 
</container> 
</div> 
` 

第一個問題是什麼?謝謝!

回答

2

XML的根元素被解組到所提供的指針的類型中。在你的情況下,這是XMLCS。由於version是根元素的一個屬性,因此它將進入XMLCS中的名爲version的字段(如果存在)。

因此改變,因爲下方的結構應該解決的問題,

type XMLCS struct { 
    XMLName string `xml:"container"` 
    Version string `xml:"version,attr"` 
} 

閱讀documentation of Marshal對XML是如何映射到結構的細節。