Thanks for you attention! You are right, I gave you too little information to help solving my problem. But at that time my handlers were absolutely "crude" and could not give the helpful information.
I solved this problem. My handlers are below.
sub start_document {
my $self = shift;
$self->{lists} = [];
$self->{curlist} = $self->{tree} = [];
}
#
#
sub start_element {
my $self = shift;
my $element = shift;
my $name = $element->{Name};
$self->{elem_name} = $element->{Name};
my $id; my $var;
if ($element->{Attributes}) {
$id = $element->{Attributes}->{'{}id'}->{Value};
$var = $element->{Attributes}->{'{}var'}->{Value};
}
if ($name eq 'part') {
my $newlist = [ {id=>$id, var=>$var} ];
push @{ $self->{lists} }, $self->{curlist};
if ($is_parent) {
push @{$self->{curlist}[0]{childs}}, @{$newlist};
} else {
push @{ $self->{curlist} }, @{$newlist};
}
$self->{curlist} = $newlist;
}
$is_parent++ if $element->{Name} eq 'part';
}
#
#
sub end_element {
my $self = shift;
my $element = shift;
my $name = $element->{Name};
# Save template name;
if ($name eq 'template') {
$self->{template} = $self->{char};
}
if ($name eq 'part') {
$self->{curlist} = pop @{ $self->{lists} };
$is_parent--;
}
}
#
#
sub characters {
my $self = shift;
my $chars = shift;
my $text = $chars->{Data};
my $clist = $self->{curlist};
$self->{char} = codes2chars($text);
}
#
#
sub end_document {
my $self = shift;
delete ($self->{curlist});
delete ($self->{lists});
my $tree = $self->{tree};
delete ($self->{tree});
$struct->{$self->{menu_name}}->{parts} = $tree;
$struct->{$self->{menu_name}}->{template} = $self->{template};
}
|