2010-11-27 6 views
1

Une partie du XML ressemble à ceci:XML :: Twig ignore certains éléments?

<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> 

Mon code est:

#!/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; 

} 

semble que je ne peux pas obtenir le texte: <text>Special implements for lifting subsoil layers</text> Je suppose que sa cause <ipcEntry kind="2" symbol="A01B0013100000" ipcLevel="A" entryType="K" lang="EN" nocore="yes"> a un autre sous ipcEntry.

Je peux obtenir <text>Means for distributing the layers on the surface</text>.

qu'est-ce que je fais mal ici?

Merci,

+1

Que voulez-vous exactement que la sortie soit? –

+0

fondamentalement, pour imprimer tous les éléments là, avec les attributs de chacun snoofkin

+2

Lorsque vous purgez, vous perdez tous les éléments avant le courant. Vous gardez simplement les parents de l'élément, vide, c'est-à-dire que vous pouvez toujours accéder à leurs attributs, mais tout leur contenu est perdu. Donc en effet supprimer est ce que vous voulez ici. – mirod

Répondre

6

De XML :: documentation Brindille:

flush Cette méthode ne doit pas être utilisé, toujours rincer la branche, pas un élément.

purge Fait la même chose qu'un "flush" sauf qu'il n'imprime pas la brindille. Il supprime simplement tous les éléments qui ont été complètement analysé jusqu'ici.

Remplacer la fonction de purge, avec la fonction de suppression imprime le texte de tous les éléments ipcEntry dans l'ordre inverse ie. en commençant par l'élément ipcEntry le plus interne.

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

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

    $element->delete; 
} 
+0

Le format XML est d'environ 8 Go, si je ne le purge pas à chaque fois, ma mémoire va se remplir, n'est-ce pas? ou très probablement je ne comprends pas l'idée derrière ce sous-purge. – snoofkin

+0

Veuillez excuser ma réponse précédente qui était incorrecte. Vous devez certainement utiliser la fonction "delete" pour couper l'ELEMENT (au lieu d'utiliser la fonction "purge") pour libérer de la mémoire. J'espère que cela t'aides. –

+0

Merci, cela a définitivement résolu mon problème! – snoofkin

Questions connexes