如何用 MACROMAN 编码解析 xml

How to parse xml with MACROMAN encoding

我正在尝试解析给定的 pom 内容但出现错误:xml:打开字符集“MACROMAN”:不支持的字符集:“MACROMAN”。 我试图通过设置 decoder.Strict = false 来禁用严格编码 但这也没有用。

Here 是 Go 游乐场 link,我在其中解析这个特定的 pom。任何 help/ref 将不胜感激。

<?xml version="1.0" encoding="MACROMAN"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 <parent>
   <groupId>org.eclipse.vorto</groupId>
   <artifactId>org.eclipse.vorto.parent</artifactId>
   <version>0.10.0.M1</version>
 </parent>
 <modelVersion>4.0.0</modelVersion>
 <artifactId>generators</artifactId>
 
 <name>Eclipse Vorto Code Generators</name>
 <packaging>pom</packaging>
 <modules>
        <module>org.eclipse.vorto.codegen.thingworx</module>
        <module>org.eclipse.vorto.codegen.javabean</module>
        <module>org.eclipse.vorto.codegen.mqtt</module>
        <module>org.eclipse.vorto.codegen.webui</module>
        <module>org.eclipse.vorto.codegen.webdevice</module>
        <module>org.eclipse.vorto.codegen.markdown</module>
        <module>org.eclipse.vorto.codegen.ios</module>
        <module>org.eclipse.vorto.codegen.latex</module>
        <module>org.eclipse.vorto.codegen.bosch.things</module>
        <module>org.eclipse.vorto.codegen.coap</module>
        <module>org.eclipse.vorto.codegen.aws</module>
        <module>org.eclipse.vorto.codegen.lwm2m</module>
        <module>org.eclipse.vorto.codegen.prosystfi</module>
        <module>org.eclipse.vorto.codegen.kura</module>
 </modules>
 
</project>
`

这些是 Go 中 macintosh 编码的已知别名:

var nameMap = map[string]htmlEncoding{
    // ...
    "csmacintosh":         macintosh,
    "mac":                 macintosh,
    "macintosh":           macintosh,
    "x-mac-roman":         macintosh,
    // ...
}

由于 macroman 不在该列表中,您可以使用 CharsetReader 功能字段通过设置

使用自定义别名列表
    decoder.CharsetReader = charsetReader

其中 charsetReader 是:

func charsetReader(charset string, input io.Reader) (io.Reader, error) {
    if isCharsetMacintosh(charset) {
        return transform.NewReader(input, charmap.Macintosh.NewDecoder()), nil
    }
    return input, nil
}

var macNames = []string{
    "macroman",
    "csmacintosh",
    "mac",
    "macintosh",
    "x-mac-roman",
}

func isCharsetMacintosh(charset string) bool {
    charset = strings.ToLower(charset)
    for _, n := range macNames {
        if charset == strings.ToLower(n) {
            return true
        }
    }
    return false
}

如果您需要更多信息,此处的答案可能会对您有所帮助:Unmarshal an ISO-8859-1 XML input in Go。查看 charset.NewReaderLabel 函数的源代码并跟踪函数调用也很有帮助。