XML unmarshal无法正常工作第一个元素

问题描述:

我正试图解组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> 
` 

第一个问题是什么?谢谢!

XML的根元素被解组到所提供的指针的类型中。在你的情况下,这是XMLCS。由于version是根元素的一个属性,因此它将进入XMLCS中的名为version的字段(如果存在)。

因此改变,因为下方的结构应该解决的问题,

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

阅读documentation of Marshal对XML是如何映射到结构的细节。