#xml #golang #utf_8 #xmlparser #cp1251
Пишу парсер для xml файлов, но проблема в том, что в файле кодировка: encoding="windows-1251". Когда перевел кодировку в ut8 то следующем кодом смог распарсить документ. for _, file := range files { _, filename := utils.Unzip("/Users/farex/upload/"+file.Filename, "/Users/farex/upload/") _ = filename ///---------- Open our xmlFile----------------------- for _, file := range filename { xmlFile, err := os.Open("/Users/farex/upload/" + file) // if we os.Open returns an error then handle it if err != nil { fmt.Println(err) } fmt.Println("Successfully Opened " + file) if utils.Cut(file, 1) == "H" { defer xmlFile.Close() byteValue, _ := ioutil.ReadAll(xmlFile) var zl_list models.ZL_LIST xml.Unmarshal(byteValue, &zl_list) fmt.Println("---ZGLV---") fmt.Println("VERSION" + zl_list.ZGLV[0].VERSION) fmt.Println("DATA" + zl_list.ZGLV[0].DATA) fmt.Println("FILENAME" + zl_list.ZGLV[0].FILENAME) fmt.Println("SD_z" + zl_list.ZGLV[0].SD_Z) Это все работает, но задача парсить не Документы в формате utf8 , а в cp-1251. Как можно "конвертировать" cp-1251 в utf-8 ? Добавил меторд: func EncodeWindows1251(ba []uint8) []uint8 { enc := charmap.Windows1251.NewEncoder() out, _ := enc.String(string(ba)) return []uint8(out) } и соответственно вызываю его: byteValue, _ := ioutil.ReadAll(xmlFile) a := EncodeWindows1251(byteValue) var zl_list models.ZL_LIST xml.Unmarshal(a, &zl_list) Тоже не работает... Но если из документа убрать строку . То все работает и документ парсится... Неужели придется регуляркой удалять эту строчку в документе? Добавил метод наисанный ниже и за импортировал. "golang.org/x/text/encoding/charmap". Но: Образец файла xml тут кодировка cp-1251
Ответы
Ответ 1
Для этого существует поле Decoder.CharsetReader: // CharsetReader, if non-nil, defines a function to generate // charset-conversion readers, converting from the provided // non-UTF-8 charset into UTF-8. If CharsetReader is nil or // returns an error, parsing stops with an error. One of the // the CharsetReader's result values must be non-nil. CharsetReader func(charset string, input io.Reader) (io.Reader, error) Использовать можно так: d := xml.NewDecoder(xmlFile) d.CharsetReader = func(charset string, input io.Reader) (io.Reader, error) { switch charset { case "windows-1251": return charmap.Windows1251.NewDecoder().Reader(input), nil default: return nil, fmt.Errorf("unknown charset: %s", charset) } } err := d.Decode(&zlList)
Комментариев нет:
Отправить комментарий