Вам нужно будет использовать потоковый анализатор с соответствующими обратными вызовами, это также улучшит скорость синтаксического анализа (и даст вам меньшее потребление памяти, если все сделано правильно), когда дело доходит до больших наборов данных, что хорошо / удивительно вещь.
Я рекомендую использовать XML::SAX
, введение в модуль доступно по следующей ссылке:
Обеспечивает обратные вызовы для start_element
, так что вы можете читать значение каждого элемента по одному за раз.
Не могли бы вы написать простой пример?
Да, и у меня уже есть!; -)
В приведенном ниже фрагменте будут проанализированы предоставленные данные OP и напечатано имя каждого элемента, а также атрибуты ключ / значение.
Это должно бытьдовольно легко понять, но если у вас есть какие-либо вопросы, не стесняйтесь добавлять их в качестве комментария, и я обновлю этот пост более подробной информацией.
use warnings;
use strict;
use XML::SAX;
my $parser = XML::SAX::ParserFactory->parser(
Handler => ExampleHandler->new
);
$parser->parse_string (<<EOT
<ds>
<uint32 name='a'/>
<uint32 name='b'/>
<string name='c'/>
<int16 name='d'/>
<uint32 name='e'/>
</ds>
EOT
);
# # # # # # # # # # # # # # # # # # # # # # # #
package ExampleHandler;
use base ('XML::SAX::Base');
sub start_element {
my ($self, $el) = @_;
print "found element: ", $el->{Name}, "\n";
for my $attr (values %{$el->{Attributes}}) {
print " '", $attr->{Name}, "' = '", $attr->{Value}, "'\n";
}
print "\n";
}
output
found element: ds
found element: uint32
'name' = 'a'
found element: uint32
'name' = 'b'
found element: string
'name' = 'c'
found element: int16
'name' = 'd'
found element: uint32
'name' = 'e'
Я не удовлетворен XML :: SAX, есть ли другие доступные модули?
Да, есть из чего выбирать.Прочитайте следующий список и выберите тот, который вам подходит для вашей конкретной задачи:
В чем разница между различными методами парсинга?
Я также рекомендую прочитать следующие часто задаваемые вопросы, касающиеся XML-парсинга.Это вызовет за и против использования синтаксического анализатора дерева (такого как XML :: Parser :: Simple) или потокового анализатора: