Perl: обработка дублированных имен элементов с использованием XML :: SAX - PullRequest
1 голос
/ 09 января 2012

Как обрабатывать повторяющиеся имена элементов в модуле perl XML :: SAX?Вот мой xml-файл:

<employees>
    <employee>
        <name>John</name>
        <age>gg</age>
        <department>Operations</department>
        <amount Ccy="EUR">100</amount>
        <company>
            <name> abc </name>
        </company>
    </employee>
    <employee>
        <name>Larry</name>
        <age>45</age>
        <department>Accounts</department>
        <amount Ccy="EUR">200</amount>
        <company>
            <name> xyz </name>
        </company>
    </employee>
</employees>

Мой вопрос: как получить доступ к элементу employee-> employee-> company-> name?(Я должен быть в состоянии напечатать «abc» и «xyz».) Я спрашиваю об этом потому, что есть еще один элемент «name» в employee-> employee-> name, который я хочу пропустить.Я хотел бы использовать XML :: SAX только потому, что моя среда поддерживает только этот модуль.Пожалуйста помоги.Большое спасибо.

1 Ответ

1 голос
/ 09 января 2012

Использование стека для записи того, в каких узлах вы находитесь, push при каждом входе в узел и pop при каждом выходе из узла:

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use XML::SAX::ParserFactory;
use XML::SAX::PurePerl;

my (@nodes, $characters, @names);

my $factory = new XML::SAX::ParserFactory;
my $handler = new XML::SAX::PurePerl;
my $parser = $factory->parser(
                  Handler => $handler,
                  Methods => {
                  start_element => sub {
                      push @nodes, shift->{LocalName};
                  },
                  characters => sub {
                      $characters = shift->{Data};
                  },
                  end_element => sub {
                      if (shift->{LocalName} eq 'name' && $nodes[-2] eq 'company') {
                          push @names, $characters;
                      }
                      pop @nodes;
                  }
              }
              );
$parser->parse_uri("sample2.xml");

print Dumper \@names;

Вывод:

$VAR1 = [
          ' abc ',
          ' xyz '
        ];

$nodes[-2] является вторым по последнему элементу в @nodes и преобразуется в 'employee' или 'company', когда shift->{LocalName} равно 'name'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...