我尝试使用“encoding/xml”包的 xml.Unmarshal 解码 XML 文件。
XML 文件的开头是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>frames</key>
<dict>
<key>0</key>
<dict>
<key>frame</key>
<string>{{0, 0}, {81, 145}}</string>
<key>offset</key>
<string>{0, 0}</string>
<key>rotated</key>
<false/>
<key>sourceColorRect</key>
<string>{{0, 0}, {80, 145}}</string>
<key>sourceSize</key>
<string>{81, 145}</string>
<key>aliases</key>
<array>
</array>
</dict>
<key>1</key>
我定义了两个结构:
// types for createfont command
type Characters struct {
XMLName xml.Name `xml:"dict"`
Char []string `xml:"key"`
}
type Result struct {
Plist string `xml:"plist"`
XMLName xml.Name `xml:"dict"`
Keys []string `xml:"key"`
Chars []Characters `xml:"dict"`
}
并以此解码:
v := Result{}
err = xml.Unmarshal([]byte(data), &v)
if err != nil {
fmt.Printf("error: %v", err)
return
} else {
fmt.Println("Result",v)
}
结果我得到:
error: expected element type <dict> but have <plist>
如果我删除 XML 文件和结构中的 plist 行,它就可以正常工作。
我要怎么写才能让它进来?
最佳答案
XMLName
字段在结构中的顺序无关紧要。解码仅针对字段名称和未排序的标签进行。
通过在您的类型中的任何位置使用 XMLName
,您声明整个类型应该属于/位于该 XML 元素中。
关于xml.Unmarshal 错误 : expected element type <dict> but have <plist>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28925055/