xml.Unmarshal error: expected element type <dict> but have <plist>
xml.Unmarshal error: expected element type <dict> but have <plist>
我尝试使用 "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
,您声明整个类型应该是 of/within 那个 XML 元素。
我尝试使用 "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
,您声明整个类型应该是 of/within 那个 XML 元素。