XML :: Twig игнорирует некоторые элементы? - PullRequest
1 голос
/ 27 ноября 2010

Часть XML выглядит следующим образом:

<ipcEntry kind="1" symbol="A01B0013080000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">
    <textBody>
        <title>
            <titlePart>
                <text>for working subsoil</text>
            </titlePart>
        </title>
    </textBody>
    <ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">
        <textBody>
            <title>
                <titlePart>
                    <text>Special implements for lifting subsoil layers</text>
                </titlePart>
            </title>
        </textBody>
        <ipcEntry kind="3" symbol="A01B0013120000" ipcLevel="A" entryType="K" lang="EN" nocore="yes">
            <textBody>
                <title>
                    <titlePart>
                        <text>Means for distributing the layers on the surface</text>
                    </titlePart>
                </title>
            </textBody>
        </ipcEntry>
    </ipcEntry>
</ipcEntry>

Мой код:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Twig;
use Data::Dumper;

my $twig_handlers = { 'ipcEntry' =>  \&ipcEntrySub };

my $file = 'A01B.xml';
my $twig= new XML::Twig( twig_handlers => $twig_handlers );
$twig->parsefile($file);
#$twig->print;




sub ipcEntrySub {

   my ($twig_obj, $element) = @_;

  print $element->{'att'}->{'symbol'} . "\n";
 print "Kind: $element->{'att'}->{'kind'}\n";
 print $element->text . "\n";
 print "###########################################\n";


    $twig_obj->purge;

}

похоже, я не могу получить текст: <text>Special implements for lifting subsoil layers</text> Я думаю, это потому, что <ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes"> имеет другой sub ipcEntry.

Я могу получить <text>Means for distributing the layers on the surface</text>.

что я тут не так делаю?

Спасибо

1 Ответ

6 голосов
/ 27 ноября 2010

Из документации XML :: Twig:

flush Этот метод НЕ следует использовать, всегда очищайте веточку, а не элемент.

purge Действует так же, как "флеш "кроме как не печатать веточку.Он просто удаляет все элементы, которые были полностью проанализированы до сих пор.

Замена функции очистки, функция удаления печатает текст всех элементов ipcEntry в обратном порядке, т.е.начиная с самого внутреннего элемента ipcEntry.

sub ipcEntrySub {
  my ($twig_obj, $element) = @_;

  print $element->{'att'}->{'symbol'} . "\n";
  print "Kind: $element->{'att'}->{'kind'}\n";
  print $element->text . "\n";

  $element->delete;
}
...