我想使用 Go 来读取 XML 文件。问题是它是一个糟糕的 XML 文件——它不符合规范。这是一个示例:
<?xml version="1.0" encoding="UTF-8"?>
<something abc="1" def="2">
<0 x="a"/>
<1 x="b"/>
<2 x="c"/>
<26 x="z"/>
</something>
尝试阅读此内容时,我的 Go 程序正确地给出了错误:
$ go run rs.go <real.xml
chardata: '
'
start: name.local='something'
start {{ something} [{{ abc} 1} {{ def} 2}]}
'abc'='1'
'def'='2'
offset=66
chardata: '
'
XML syntax error on line 3: invalid XML name: 0
exit status 1
这是小 Go 程序:
package main
import (
"encoding/xml"
"fmt"
"io"
"os"
)
// <something abc="1" def="2">
type Something struct {
abc string `xml:"abc"`
def string `xml:"def"`
spots []Spot
}
// <0 x="a"/>
type Spot struct {
num int // ??
xval string `xml:"x"`
}
func main() {
dec := xml.NewDecoder(os.Stdin)
// dec.Strict = false // doesn't help <0 ...> problem
// dec.Entity = xml.HTMLEntity
for {
tok, err := dec.Token()
if err == io.EOF {
break
} else if err != nil {
fmt.Fprintf(os.Stderr, "%v\n", err)
os.Exit(1)
}
switch tok := tok.(type) {
case xml.StartElement:
fmt.Printf("start: name.local='%s'\n", tok.Name.Local)
fmt.Printf("start %v\n", tok)
for _, a := range tok.Attr {
fmt.Printf("'%s'='%s'\n", a.Name.Local, a.Value)
}
fmt.Printf("offset=%d\n", dec.InputOffset())
case xml.EndElement:
fmt.Printf("end: name.local='%s'\n", tok.Name.Local)
case xml.CharData:
fmt.Printf("chardata: '%s'\n", tok)
case xml.Comment:
fmt.Printf("comment: '%s'\n", tok)
}
}
}
有没有 Go 专家可以帮助我弄清楚如何让 Go 阅读这个愚蠢的 XML 文件?谢谢!
慕妹3242003
慕斯王
相关分类