亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 Go 讀取錯誤的 XML

如何使用 Go 讀取錯誤的 XML

Go
森欄 2021-12-13 18:48:58
我想使用 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,然后使用 Goxml包進行解析。

  • 另一種選擇(可能是一個不錯的選擇,取決于您的“XML”輸入有多瘋狂)是實現您自己的解析器,如 Gopher Academy 博客中所述:advent-2014/parsers-lexers


查看完整回答
反對 回復 2021-12-13
?
慕斯王

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)


查看完整回答
反對 回復 2021-12-13
  • 2 回答
  • 0 關注
  • 396 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號