В Perl, как я могу проанализировать XML-файл, который слишком велик для размещения в доступной памяти? - PullRequest
1 голос
/ 09 июля 2010

У меня очень большой XML-файл (если вам интересно, это AIXM-файл из EAD, но это не важно).Чтобы выяснить, как он используется, я хочу написать простой сценарий, который проходит и для каждого узла, записывает, какие подузлы встречаются под ним и сколько раз, чтобы я мог видеть, какие узлы содержат <AptUid> и больше ли *Узлы 1002 * имеют узел <GeoLat> или нет, такого рода вещи.

Я пытался просто загрузить все это в хеш-код, используя XML :: Simple , но он слишком большойвписаться в память.Есть ли синтаксический анализатор XML, который позволит мне просто просматривать файл по частям за раз?

Ответы [ 6 ]

8 голосов
2 голосов
/ 09 июля 2010

Вы хотите использовать синтаксический анализатор SAX XML :: SAX Реализация методов start_element и end_element для построения дерева узлов

1 голос
/ 09 июля 2010

Вот решение с использованием XML :: Parser. Комментарии приветствуются.

use XML::Parser;

%elemMap = ();

@context = ();

sub on_start {
    my ($p, $elemName, @alist) = @_;
    my $parent = @context[-1];
    if ($parent) {
        $elemMap{$parent}{$elemName}++;
    }        
    push(@context, $elemName);
}

sub on_end {
    pop(@context);
}

$p = new XML::Parser(Handlers => {Start => \&on_start, End => \&on_end});
$p->parse(STDIN);

while (my ($elem, $childElems) = each(%elemMap)) {
    while (my ($childElem, $count) = each(%{$childElems})) {
        print "$elem > $childElem: $count\n";
    }
}
1 голос
/ 09 июля 2010

Вам следует использовать потоковый анализатор, например XML::Parser (который, в свою очередь, находится на уровне выше expat ).Вам нужно будет зарегистрировать обработчики для интересующих вас тегов и вести бухгалтерский учет самостоятельно.Как и в других потоковых моделях, таких как SAX, вы не получаете полное представление о файле сразу (за исключением подмножества, которое вы явно используете в своем коде).

1 голос
/ 09 июля 2010

Попробуйте модуль XML :: Parser . Должно быть то, что вам нужно.

другая ссылка

0 голосов
/ 09 июля 2010

Когда вы впервые пытаетесь выяснить структуру неизвестного XML-файла, откройте его меньше или больше и начните пролистывать его. Не используйте редактор, который пытается загрузить весь файл в память, если вам не нравится много ждать вашего компьютера.

Создание синтаксического анализатора, когда вы не представляете, как структурированы данные, будет очень неприятным, поэтому сначала не переходите к кодированию, переходите к изучению, пока не узнаете достаточно, чтобы начать кодирование.

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