【问题标题】:Go XML error: invalid character entityGo XML 错误:无效字符实体
【发布时间】:2019-01-30 13:33:59
【问题描述】:

Go 无法解析带有声明实体的正确 xml 文件,不断收到此错误:

错误:第 47 行的 XML 语法错误:无效字符实体 &n;

行为<pos>&n;</pos>,实体定义为<!ENTITY n "noun (common) (futsuumeishi)">

这是 Go 中的程序:http://play.golang.org/p/94_60srVne

【问题讨论】:

    标签: go


    【解决方案1】:

    如果您创建 Decoder 并弄乱其 Entity 映射,则可以传入实体。我怀疑这个包实际上并没有解析 DTD,只是在 xml.go 附近闲逛;我看到一条评论说它为调用者积累了实体,但没有任何东西本身在d.Entity 中设置条目。

    (即使encoding/xml 安全地提供这一点也很棘手,因为有一个内置的 shared HTML 实体映射。为一个文档更新它会影响其他文档的解析。)

    与常规 xml.Unmarshal 相比,创建具有自定义实体的解码器需要更多的文书工作,但不会太多:

    func main() {
        jmd := JMdict{}
    
        d := xml.NewDecoder(bytes.NewReader([]byte(str)))
        d.Entity = map[string]string{
            "n": "(noun)",
        }
        err := d.Decode(&jmd)
        if err != nil {
            fmt.Printf("error: %v", err)
            return
        }
        fmt.Println(jmd)
    }
    

    这是一个 Playground linkEntity 技巧和一些输出代码以将对象显示为 JSON。

    【讨论】:

      【解决方案2】:

      前面的答案是“正确”的答案,但我相信,根据您真正想要完成的任务,“快速”的答案是禁用 Strict。例如:

      d := xml.NewDecoder(os.Stdin)
      d.Strict = false            
      

      【讨论】:

      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2011-01-22
      • 2010-11-21
      • 1970-01-01
      • 2023-03-18
      • 2015-07-16
      相关资源
      最近更新 更多