2017-06-13 9 views
0

XMLをアンマーシャリングしようとしています。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> 
` 

最初の問題は何ですか?ありがとう!

答えて

2

XMLのルート要素は、提供されたポインタの型にアンマーシャリングされます。あなたの場合、これはXMLCSです。 versionはルート要素の属性なので、versionというフィールドがある場合はXMLCSというフィールドに入ります。

ので、以下のようにあなたの構造体を変更すると、問題を修正する必要があり、

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

XMLは、構造体にマップされている方法の詳細についてdocumentation of Marshalをお読みください。

関連する問題