xml.Unmarshal 错误 : expected element type <dict> but have <plist>

标签 xml go unmarshalling cocos2d-js

我尝试使用“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/

相关文章:

java - 如何在 jaxb 解码中检查 XML 中的整数字段是否具有字符串值

json 忽略标记 ("-") 不适用于嵌入式子结构

html - 将 XElement 转换为 HTML 字符串

html - 如何在 Atom 中语法高亮 go 模板文件?

java - 如何在 Java 中使用 StAX Parser 在 XML 中声明 DOCTYPE 和 ENTITY

arrays - Golang问题数组数独-网格[i] [j] [0]

go - 对所有文件使用 package main,仍然说未定义

java - 使用 JaxB 解码具有唯一值

javascript - 从输入控件中检索特定模式类型的子节点

javascript - GeoXML3 访问 KML 属性数据