ubukulov
@ubukulov
Веб-разработчик

Как решить проблему "xml: encoding «windows-1251» declared but Decoder.CharsetReader is nil"?

Дорогие тостеры!

Возникла проблема при парсинге xml файла с кодировкой windows-1251 на Golang.

Выходит ошибка: xml: encoding "windows-1251" declared but Decoder.CharsetReader is nil

Вот часть кода с файла:

<?xml version="1.0" encoding="windows-1251"?>
<yml_catalog date="2018-07-28 21:00">
  <shop>
    <name>Powerplant</name>
    <company>Powerplant</company>
    <url>http://www.powerplant.kz/</url>
    <currencies>
      <currency id="KZT" rate="1"/>
    </currencies>
    <categories>
    <category id="28">Универсальные мобильные батареи</category><category id="76">Экшн Камеры</category><category id="101">Аксессуары для ноутбуков</category><category parentId="101" id="35">Карт-ридер</category><category parentId="101" id="102">Блоки питания для ноутбуков</category><category parentId="102" id="1">Блоки питания для ноутбуков ACER</category><category parentId="102" id="3">Блоки питания для ноутбуков APPLE</category><category parentId="102" id="5">Блоки питания для ноутбуков ASUS</category><category parentId="102" id="8">Блоки питания для ноутбуков DELL</category><category parentId="102" id="30">Блоки питания для ноутбуков SAMSUNG</category><category parentId="102" id="34">Блоки питания для ноутбуков SONY</category><category parentId="102" id="89">Блоки питания для ноутбуков HP</category><category parentId="102" id="92">Блоки питания для ноутбуков Lenovo (IBM)</category><category parentId="102" id="96">Блоки питания для ноутбуков Universalnie bloki pitaniya</category><category parentId="101" id="103">Аккумуляторы для ноутбуков</category><category parentId="103" id="20">Аккумуляторы для ноутбуков HP</category><category parentId="103" id="21">Аккумуляторы для ноутбуков ACER</category><category parentId="103" id="22">Аккумуляторы для ноутбуков DELL</category></categories>
    <cpa>1</cpa>
    <offers>
    <offer id="PB-SS002" available="true"><age>0</age><delivery>true</delivery><currencyId>KZT</currencyId><name>Универсальная cолнечная мобильная батарея PowerPlant/PB-SS002/10000mAh/</name><categoryId>28</categoryId><description>"Внешний источник питания PowerPlant PB-SS002/10000mAh/ это портативное мобильное устройство, которое в силах существенно продлить время автономной эксплуатации вашей цифровой техники. Благодаря современным технологиям и квалифицированному подходу разработчиков компании PowerPlant, устройство имеет массу преимуществ среди аналогов.Аккумулятор включает в себя батарею большой емкости, имеет многоуровневую систему защиты от перегрева и замыканий электросети. Имеет функцию энергосбережения в режиме ожидания, а светодиодный индикатор позволяет держать на контроле уровень заряда устройства. Современный, легкий, практичный и очень умный источник энергии достойный стать вашим незаменимым аксессуаром на каждый день."

Технические характеристики:

Название:  Универсальная cолнечная мобильная батарея PowerPlant/PB-SS002/10000mAh/
Тип батареи: Li-Polymer
Совместимость: Универсальная
Емкость: 10000 mAh / 37 Wh
Вход: micro USB 5V / 1A (max.)
Выход: USB порт: USB1 5V/1A  USB2 5V/2.1A
Солнечная панель 15V / 150mA (для компенсации саморазряда батареи)
Дополнительно: LED индикатор уровня остаточного заряда, кабель с micro USB конектором
Материал: Пластиковый корпус
Цвет: orange
Система защиты: Многоуровневая система защиты для всех подключаемых устройств, стабилизатор напряжения, стабилизатор выходного напряжения для всех портов
Переходники для мобильных устройств: 
Micro USB
Mini  USB
Apple 30 pin
Nokia
PSP
SonyEricson
Samsung D800
Samsung i900
LG
NDSL (Nintendo)
Время полной зарядки: 3-5 ч (при зарядке через micro USB)
Размеры: 138*74*15.5 мм (только батарея)
Вес: 262 г ± 10 г (только батарея)
Комплектация: Мобильный аккумулятор, 10 переходников для мобильных устройств, кабель переходник, руководство пользователя.
Особенности: ударопрочный, пылезащищённый.
Производитель: PowerPlant
Гарантия 12 месяцев

&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PB-SS002_1.jpg"&gt;
&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PB-SS002_2.jpg"&gt;
&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PB-SS002_3.jpg"&gt;
&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PB-SS002_4.jpg"&gt;
&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PB-SS002_5.jpg"&gt;
</description><cost_price>19499.25</cost_price><picture>http://www.KievDigital.eu/usistema2/Vartotojai/Naujienos/PB-SS002img.jpg</picture><barcode>6952332000651</barcode><price>25999.00</price><vendor>PowerPlant</vendor></offer><offer id="PPLA103" available="true"><age>0</age><delivery>true</delivery><currencyId>KZT</currencyId><name>Универсальная мобильная батарея PowerPlant/PB-LA103/2600mAh/</name><categoryId>28</categoryId><description>"Внешний источник питания PowerPlant PB-LA103/2600mAh/ это портативное мобильное устройство, которое в силах существенно продлить время автономной эксплуатации вашей цифровой техники. Благодаря современным технологиям и квалифицированному подходу разработчиков компании PowerPlant, устройство имеет массу преимуществ среди аналогов.Аккумулятор включает в себя батарею большой емкости, имеет многоуровневую систему защиты от перегрева и замыканий электросети. Имеет функцию энергосбережения в режиме ожидания, а светодиодный индикатор позволяет держать на контроле уровень заряда устройства. Современный, легкий, практичный и очень умный источник энергии достойный стать вашим незаменимым аксессуаром на каждый день."

Технические характеристики:

Название: Универсальная мобильная батарея PowerPlant/PB-LA103/2600mAh/
Тип батареи: Li-Polymer
Совместимость: Универсальная 
Емкость: 2600 mAh/9.6 Wh
Вход: USB 5V / 1000 mA (max.) 
Выход: USB порт : 1 x USB 5V / 1000 mA (max.) 
Материал: Металлический корпус 
Цвет: зелёный
Система защиты: Многоуровневая система защиты для всех подключаемых устройств, стабилизатор напряжения, стабилизатор выходного напряжения для всех портов
Кабель для мобильных устройств:Micro USB
Время полной зарядки: 2-3 ч (при зарядке через micro USB) 
Размеры: 96 х 26 х 26 мм (только батарея)
Вес: 58 ± 10 г. (только батарея)
Комплектация: Мобильный аккумулятор, кабель переходник.
Производитель: PowerPlant 
Гарантия: 12 мес.

&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PPLA103_1.jpg"&gt;
&lt;img src="http://www.eurodigital.lt/usistema2/Vartotojai/Naujienos/PPLA103_2.jpg"&gt;


  </description><cost_price>1949.25</cost_price><picture>http://www.KievDigital.eu/usistema2/Vartotojai/Naujienos/PPLA103img.jpg</picture><barcode>6952332000675</barcode><price>2599.00</price><vendor>PowerPlant</vendor></offer>
  • Вопрос задан
  • 933 просмотра
Решения вопроса 1
ubukulov
@ubukulov Автор вопроса
Веб-разработчик
Задача решили другим способом. Ниже предлагаю метод. Конвертация мы сделали с помощью команду линукс.

func DownloadPowerFile(url string) *PowerCatalog {
	list := PowerCatalog{}
	// скачиваем файл по ссылке и сохраняем в папку files
	err := DownloadFilePower("Powerplant_Talapai.yml", url)
	if err != nil {
		fmt.Println(err)
		return &list
	}
	var path string
	path = "/root/go-workpath/src/stocks/files/"
	// переконвертируем файл
	cmd := exec.Command("iconv", "-f", "cp1251", "-t", "utf8",  path + "Powerplant_Talapai.yml", "-o", path + "Powerplant_Talapai8.yml")
	out, err := cmd.CombinedOutput()
	if err != nil {
		fmt.Printf("cmd.Run() failed with %s\n", err)
	}
	fmt.Printf("combined out:\n%s\n", string(out))
	// из файла Powerplant_Talapai8.yml убираем строку encoding="windows-1251". Надо проверит в наличие программу SED
	cmd2 := exec.Command("sed", "-i", "s/ encoding=\"windows-1251\"//", path + "Powerplant_Talapai8.yml")

	out2, err2 := cmd2.CombinedOutput()
	if err2 != nil {
		fmt.Printf("cmd.Run() failed with %s\n", err2)
	}
	fmt.Printf("combined out:\n%s\n", string(out2))
	// открытие файла
	resp, err := os.Open(path + "Powerplant_Talapai8.yml")

	if(err != nil) {
		fmt.Println("Невозможно найти файл или открыть")
		return &list
	} else {

		defer resp.Close()

		body, err := ioutil.ReadAll(resp)

		if err != nil {
			return &list
		}

		newbody := strings.Replace(string(body), "<offers>", "", -1)
		newbody = strings.Replace(newbody, "</offers>", "", -1)
		err = xml.Unmarshal([]byte(newbody), &list)

		if err != nil {
			fmt.Println(err)
			return &list
		}

		return &list
	}
}

func DownloadFilePower(filepath string, url string) error {

	// Create the file
	out, err := os.Create("files/"+filepath)
	if err != nil {
		return err
	}
	defer out.Close()

	// Get the data
	resp, err := http.Get(url)
	if err != nil {
		return err
	}
	defer resp.Body.Close()

	// Write the body to file
	_, err = io.Copy(out, resp.Body)
	if err != nil {
		return err
	}

	return nil
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы