2010-10-08 2 views
3

J'essaie d'extraire des données à partir de fichiers journaux au format XML. Comme ils sont énormes, j'utilise XML::Twig pour extraire les données pertinentes d'un tampon à la place du fichier entierComment puis-je analyser des fragments XML incomplets avec XML :: Twig de Perl?

Comme ce sont des données concaténées de STDIN, le XML est loin d'être bien formé. Si souvent, l'analyseur s'arrête avec une erreur. Comment puis-je obtenir l'analyseur XML pour ignorer les erreurs et extraire uniquement les tags qui m'intéressent? Dois-je revenir à l'analyse syntaxique des expressions régulières (start-tag-end-tag)?

+0

Pouvez-vous donner un exemple de ce que vous concatèez aux journaux de STDIN? et aussi quels tags cherchez-vous? – Ibrahim

+0

ce sont les journaux openfire/jabber/xmpp. Les données pertinentes (journaux de discussion) sont entre Tags – goorj

Répondre

0

J'ai fini avec un solution double où j'ai écrit une simple routine d'analyseur qui pouvait extraire des éléments multilignes <message>, et canalisé ces fragments bien formés vers une autre routine où j'ai utilisé des bibliothèques Perl XML pour extraire des données.

4

Je s'accumuler en fait juste les données entre <message></message> balises et analyser cette chaîne, en supposant que le contenu de chaque message est petit:

#!/usr/bin/perl 

use strict; use warnings; 

use XML::Simple; 
use Data::Dumper; 

my $in_message; 
my $message; 

LOGENTRY: 
while (my $line = <DATA>) { 
    while ($line =~ /^<message/ .. $line =~ m{</message>$}) { 
     $message .= $line; 
     next LOGENTRY; 
    } 
    if ($message) { 
     process_message($message); 
     $message = ''; 
    } 
} 

sub process_message { 
    my ($message) = @_; 

    my $xml = XMLin(
     $message, 
     ForceArray => 1, 
    ); 
    print Dumper $xml; 
} 

__DATA__ 
ldksj 
lskdfj 
lksd 

sdfk 

<message sender="1">Hi</message> 

sdk 
dkj 

<message sender="2">Hi yourself!</message> 

sd 

Sortie:

$VAR1 = { 
      'sender' => '1', 
      'content' => 'Hi' 
     }; 
$VAR1 = { 
      'sender' => '2', 
      'content' => 'Hi yourself!' 
     };
+0

Merci pour la suggestion de solution (très élégant!). Cependant je crains que chaque tag ne soit sur une seule ligne, un nouveau peut commencer sur la même ligne etc .. quelque chose qui le rend (légèrement) plus difficile à analyser! J'espérais que Xml: Twig me protégerait du travail de tout mettre en place, de maintenir les tampons, etc. – goorj

Questions connexes