XML unmarshal不在第一个元素上工作

时间:2017-06-13 08:06:41

标签: xml go

我正在尝试解组XML。

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>
`

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

1 个答案:

答案 0 :(得分:2)

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

因此,如下更改结构应该可以解决问题,

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

阅读documentation of Marshal,了解有关XML如何映射到结构的详细信息。