Пишу парсер для 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
Ответ
Для этого существует поле 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)
Комментариев нет:
Отправить комментарий