Forum Webscript.Ru

Программирование => Perl => Тема начата: flamey от 24 Ноября 2006, 00:18:53

Название: Чтение XML - популярная альтернатива XML::DOM/Parser?
Отправлено: flamey от 24 Ноября 2006, 00:18:53
Хочу считывать курсы валют с сайта нашего ЦБ и с сайта нац банка одной центрально-европейской страны.

Оказалось что у XML::Parser\'а нет файла конфигурации для работы с кодировкой CP1251, и каждый скрипт он тормозит с ошибкой что нет такого файла. С CP1250 всё работает. Нужного файла нет на CPAN\'е, есть он на сайте одного нашего соотечественника, но хостинг у меня буржуйский, и они отказываются мне его поставить.

смена хостинга на данный момент не рассматривается, сервер "упал" один раз за пол года которые я с ними, такого у меня ещё не было.

вопросы,
- можно ли как-то как-нибудь обойти эту проблему, напр. указать парсеру не смотрель на кодировку, или XML::DOM для меня потерян?
- какая есть популярная альтернатива (популярная, потому что надеюсь уже у хостинга будет установлена и не надо будет им опять что-то доказывать) этим модулям, чтобы попроще в обращении?

заранее спасибо!
Название: Чтение XML - популярная альтернатива XML::DOM/Parser?
Отправлено: Green Kakadu от 24 Ноября 2006, 21:17:08
Цитировать
flamey:
Оказалось что у XML::Parser\'а нет файла конфигурации для работы с кодировкой CP1251, и каждый скрипт он тормозит с ошибкой что нет такого файла. С CP1250 всё работает. Нужного файла нет на CPAN\'е, есть он на сайте одного нашего соотечественника, но хостинг у меня буржуйский, и они отказываются мне его поставить.


че-то ты намешал по моему... причем тут XML::Parser и \'нет такого файла\' и кодировка? Ты пытаешься файлы называть по русски что ли а потом сувать их в парсер?
Название: Чтение XML - популярная альтернатива XML::DOM/Parser?
Отправлено: flamey от 25 Ноября 2006, 03:57:37
Пример:


# __TEST.XML_________________________________



036
AUD
1
Австралийский доллар
16,0102






# __TEST.PL_________________________________
#!/usr/bin/perl
use warnings;

use XML::Parser;

my $CBRfile = "test.xml";
my $CBRparser = new XML::Parser();

my $CBRlist = $CBRparser->parsefile($CBRfile);


до того как я добавил windows-1251.enc (который я нашёл в инете) в C:\\Perl\\site\\lib\\XML\\Parser\\Encodings, результат вышеприведённого примера был:


Couldn\'t open encmap windows-1251.enc:
No such file or directory
 at C:/Perl/site/lib/XML/Parser.pm line 187


а всё из-за этого:
"Expat has built-in encodings for: UTF-8, ISO-8859-1, UTF-16, and US-ASCII. ... For encodings other than the built-ins, expat calls the function load_encoding in the Expat package with the encoding name. This function looks for a file in the path list @XML::Parser::Expat::Encoding_Path, that matches the lower-cased name with a \'.enc\' extension. The first one it finds, it loads." (из док-ции XML::Parser)

как только добавил я этот файл всё заработало.

хостинг провайдер отказывается добавить этот файл.

вообще-то я щас буду пробовать одну идею, но всё равно интересно есть ли альтернатива которая не является wrapper\'ом XML::Parser-а.
Название: Чтение XML - популярная альтернатива XML::DOM/Parser?
Отправлено: Green Kakadu от 25 Ноября 2006, 17:13:43
понятно. Как варианты:

1. перегнать xml в utf-8

use Text::Iconv;
 $converter = Text::Iconv->new("windows-1251", "utf-8");
 $xml_in_utf = $converter->convert("содержимое твоего xml");
только надо будет в заголовке xml сменить encoding="windows-1251" на encoding="utf-8"

2. вырезать все русские символы. И тогда можно тоже смело сменить  encoding="windows-1251"
Название: Чтение XML - популярная альтернатива XML::DOM/Parser?
Отправлено: flamey от 25 Ноября 2006, 19:54:02
спасибо за советы!

в др. форуме тоже посоветовали поменять кодировку. я так и сделал, всё работает. я не знал что XML::DOM может работать со строками, везде примеры только с URL\'ами. наверно надо начинать с документации, а не с примеров :)

а Text::Iconv на сервере тоже не стоит :(