Почему партнеры выбирают DOM а не SAX парсеры?

Обсуждение сервиса товарной рекламы Микс-Товары
Ответить
Александр Сабаев
Сообщения: 7
Зарегистрирован: 08 июл 2005, 18:11

Почему партнеры выбирают DOM а не SAX парсеры?

Сообщение Александр Сабаев » 08 июл 2005, 18:25

В связи с тем, что многие партнеры выразили желание чтобы XML-файл экспорта для партнера мог быть разбит на отдельные, содержащие только одного рекламодателя, куски - мне стало интересно, почему партнеры этого могут хотеть. Удивительно, но большинство назвало в качестве причины то, что файл получается большой и не лезет в память. Господа программеры - коллеги! Если кто-то не умет пользоваться SAX парсерами - обязуюсь помочь или, по крайней мере, дать ссылку на литературу.

ЗЫ: Разбивку мы, конечно, сделали - клиент почти всегда прав :)
Но все-таки мое мнение, что оно не есть хорошо

Засим мой опус прерываю.

Taifur

Сообщение Taifur » 26 июл 2005, 14:02

Всё лезет, просто некоторые рекламодатели откатываются на нескольких площадках, и на сайтах некоторых партнёров уже присутствуют. Может в этом причина. Хотя для меня по барабану я бы просто отфильтровал и всё.

ultrastore
Сообщения: 5
Зарегистрирован: 05 июн 2006, 12:31

Сообщение ultrastore » 05 июн 2006, 12:35

День добрый!
Хотелось бы кусок кода perl скрипта использующего SAX парсер на ultrastore@mail.ru или выложите прямо сюда. Teм более знаю, что данный скрипт у Вас имеется и именно на perl.

Andrew
Сообщения: 12
Зарегистрирован: 17 апр 2006, 13:06

Re: Почему партнеры выбирают DOM а не SAX парсеры?

Сообщение Andrew » 05 июн 2006, 19:06

Александр Сабаев писал(а):Удивительно, но большинство назвало в качестве причины то, что файл получается большой и не лезет в память.
Я использую SAX и все равно возникают проблемы с файлами больше 8 Мб.

Если обещали помочь, то помогайте. Оптимально код парсера на PHP выложить в общий доступ или дать ссылку или в личку.

ДАННЫЕ ПОСЛЕ ПАРСИНГА У МЕНЯ ВЫГЛЯДЯТ ТАК:

Код: Выделить всё

Array
(
    [categories] => Array
        (
            [0] => Array
                (
                    [id] => 91656
                    [parentId] => 91649
                    [_content] => Ножницы
                )
        )

.....

    [offers] => Array
        (
            [0] => Array
                (
                    [offers] => 
                    [url] => http://mixmarket.biz/clk.plx?id=137260&gid=1234567
                    [price] => 1677
                    [currencyId] => USD
                    [categoryId] => 226667
                    [picture] => Array
                        (
                            [w] => 80
                            [h] => 60
                            [_content] => http://mixmarket.biz/images/of/184/8.jpg
                        )

                    [typePrefix] => Генератор дизельный
                    [vendor] => Array
                        (
                            [id] => 472
                            [_content] => SDMO
                        )

                    [model] => DX 3000
                    [description] => . Производитель - SDMO (Франция) . Максимальная мощность - 3 кВА. Номинальная активная мощность - 2.4 кВт. Выходное напряжение - 230 В (однофазный) . Двигатель - Yanmar L48 . Тип топлива - дизель . Тип охлаждения - воздушное . Тип запуска - ручной . Объем топливного бака - 2.5 л. Время работы на одном баке - 3.7 час. Время работы при 50% нагрузке - 4 час. Генератор - Синхронный Mecc Alte . Габариты - 59х46х48 см. Масса - 54 кг. Исполнение - открытое в раме . Уровень шума (15 м) - 77 дБ.. Класс электростанции - профессиональная
                )
        )

.....

)

ultrastore
Сообщения: 5
Зарегистрирован: 05 июн 2006, 12:31

Сообщение ultrastore » 12 июн 2006, 10:35

Господа! Разбудите программистов, хотелось бы все таки получить ответ на свой вопрос, уже полтора месяца в ожидании.
Нужен кусок кода perl скрипта использующего SAX парсер, для парсинга прайсов более 8 Мб. (Techhome, 003 и т.д.), на ultrastore@mail.ru или выложите прямо сюда.

Александр Сабаев
Сообщения: 7
Зарегистрирован: 08 июл 2005, 18:11

Вот упрощенный парсер на перл

Сообщение Александр Сабаев » 13 июн 2006, 17:12

package MyContentHandler;
use Text::Iconv;
use base qw(XML::SAX::Base);

my $converter = Text::Iconv->new("UTF-8", "CP1251");

sub start_document {
my $self = shift;
$self->{Context}=();
$self->{text} = '';

$total_price = 0;
}

sub end_document {
print "Order total: $total_price\n";
}

sub start_element{
my $self = shift;
my $el = shift;
$name= $el->{LocalName};

my $len=scalar (@{$self->{Context}});
if($len>0)
{
if($len && ($self->{Context}[$len-1] eq 'advertizers') && ($name eq 'adv'))
{
$self->{ADV}=$el->{Attributes};
}
if($len && $self->{Context}[$len-1] eq 'brands' && $name eq 'brand')
{
$self->{BRAND}=$el->{Attributes};
}
if($len && $self->{Context}[$len-1] eq 'offers' && $name eq 'offer')
{
$self->{OFFER}=$el->{Attributes};
}
if($len && $self->{Context}[$len-1] eq 'categories' && $name eq 'category')
{
$self->{CATEGORY}=$el->{Attributes};
}

}
push(@{$self->{Context}},$name);

$currentElement = $local_name;
$self->clear_text();
}

sub end_element{
my $self = shift;
my $el = shift;
my $len=scalar (@{$self->{Context}});

my $text = $converter->convert($self->get_text());
my $name = $el->{LocalName};

if($name eq 'adv')
{
print "рекламадатель:",$self->{ADV}->{"{}id"}->{Value},"\t",$text,"\t",$self->{ADV}->{"{}id"}->{url},"\n";

}
elsif($name eq 'category')
{
print "Рубрика:",$self->{CATEGORY}->{"{}id"}->{Value},"\t",$text,"\n";
}
elsif($name eq 'brand')
{
print "производитель:",$self->{BRAND}->{"{}id"}->{Value},"\t",$text,"\n";
}
elsif($name eq 'offer')
{
print "\n\nтовар:\t",$self->{OFFER}->{"{}id"}->{Value},"\n";
print "Тип:\t",$self->{SUBOFFER}->{'type'},"\n";
print "производитель:\t",$self->{OFFER}->{"{}brandid"}->{Value},"\n";
print "Рубрика:\t",$self->{OFFER}->{"{}cat"}->{Value},"\n";
print "Цена:\t",$self->{SUBOFFER}->{'price'},"\n";
print "картинка:\t",$self->{OFFER}->{"{}src"}->{Value},"\n";
print "url:\t",$self->{SUBOFFER}->{'url'},"\n";
print "Описание:",$self->{SUBOFFER}->{'desc'},"\n";
}
else
{
$self->{SUBOFFER}->{$name}=$text;
}
pop(@{$self->{Context}})."\n";
}

sub display_text {
my $self = shift;
print $self->get_text();
}

sub get_text {
my $self = shift;
my $text = '';
if ( defined( $self->{text} ) ) {
$text = $self->{text};
$self->{text} = '';
}
return $text;
}

sub clear_text {
my $self = shift;
$self->{text} = '';
}

sub characters {
my $self = shift;
my $text = shift;

$self->{text} .= $text->{Data};
}


package main;

use XML::SAX;

XML::SAX->add_parser(q(XML::SAX::PurePerl));

$total_price = 0;
$item_id = '';
$current_element = '';
$item_name = '';
$quantity = '';
$unit_price = '';


my $factory = XML::SAX::ParserFactory->new();
my $parser = $factory->parser( Handler => MyContentHandler->new() );

eval { $parser->parse_uri('http://mixmarket.biz/mixml.plx?id=4294966027'); };
#eval { $parser->parse_uri('test.xml'); #};

print "Error parsing file: $@" if $@;

Александр Сабаев
Сообщения: 7
Зарегистрирован: 08 июл 2005, 18:11

коммент к примеру

Сообщение Александр Сабаев » 13 июн 2006, 17:17

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

vasbooga
Сообщения: 1
Зарегистрирован: 01 ноя 2006, 15:17

А можно аналогичный код на php

Сообщение vasbooga » 01 ноя 2006, 15:24

А можно выложить аналог кода на php

Ответить