我想使用 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.xmlchardata: ''start: name.local='something'start {{ something} [{{ abc} 1} {{ def} 2}]}'abc'='1''def'='2'offset=66chardata: ' 'XML syntax error on line 3: invalid XML name: 0exit status 1這是小 Go 程序:package mainimport ( "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 文件?謝謝!
2 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
發表我的評論作為答案。
您似乎無法在此處直接使用 Go xml 包。但你可以:
考慮分叉 xml 包并更改
isName
函數以允許您的格式,或者首先清理 XML,將其更改為有效的 XML,然后使用 Go
xml
包進行解析。另一種選擇(可能是一個不錯的選擇,取決于您的“XML”輸入有多瘋狂)是實現您自己的解析器,如 Gopher Academy 博客中所述:advent-2014/parsers-lexers

慕斯王
TA貢獻1864條經驗 獲得超2個贊
我能夠閱讀 XML 文件。只需將壞條目改寫為好條目,然后讓 Unmarshall 完成它的工作。我擁有的格式錯誤的文件很?。ㄐ∮?10k),因此如果 XML 文件為 100 MB,這可能不是一個好的選擇。
re := regexp.MustCompile("<([0-9]+)")
s := re.ReplaceAllString(string(raw), "<splat n=\"${1}\"")
x := Something{Abc: "0"}
err = xml.Unmarshal([]byte(s), &x)
- 2 回答
- 0 關注
- 396 瀏覽
添加回答
舉報
0/150
提交
取消