2009-10-06 7 views
4

Je veux obtenir une chaîne spécifique, par exemple 123 dans < reçu> 123 </reçu> de du code XML qui sera récupéré à partir d'une URL.Comment puis-je extraire des données XML d'une URL en utilisant XML :: Twig?

J'ai écrire un code, mais coincé avec un message d'erreur:

Tentative de bénir en référence à la ligne /usr/share/perl5/XML/Twig.pm 392.

Comment puis-je le résoudre?

Le code:

use XML::Twig; 
use LWP::Simple; 

my $url = 'http://192.168.1.205:13000/status.xml'; 
my $twig = new XML::Twig(TwigRoots => { 
'smsc/received' => sub {$author = $_[1]->text; }}); 
$twig->nparse($url); 
$twig->print; 
+2

En note, voir cette réponse pour pourquoi utiliser 'new XML :: Twig' est mauvais et pourquoi' XML :: Twig-> new' est préféré: http://stackoverflow.com/questions/429657/quoi-est-la-différence-entre-new-someclass-et-someclass-new-in-perl/429798 # 429798 – friedo

+0

Merci pour cette suggestion. Je l'ai réécrit avec mes $ twig = XML :: Twig-> new (Twig_Roots => {...}}); fonctionne bien :) - – conandor

Répondre

5

nparse prend soin du new pour vous (d'où le « n »), ce que vous voulez dans ce cas est probablement xparse, ou tout simplement laisser module dehors et faire ceci:

my $url= 'http://192.168.1.205:13000/status.xml'; 
my $twig= XML::Twig->parse(twig_roots => 
           { 'smsc/received' => sub { $author= $_[1]->text;}}, 
          $url 
          ); 
$twig->print; # I am not sure why you print the twig instead of just $author 
+0

Merci mirod. Cela fonctionne bien avec xparse. Pour info, le $ twig-> print est juste pour l'utilisation du débogage. En fait, je veux juste la valeur $ auteur. – conandor

3

semble être un bogue dans nparse méthode parce que si vous remplacez cette ligne avec:

$twig->parse(LWP::Simple::get($url)); 

alors vous devriez trouver cela fonctionne très bien (ou il ne quand je l'essaie).

/I3az/

+0

ce n'est pas un bug dans nparse, c'est un bug dans la façon dont il s'appelle ;-) – mirod

+0

Ah oui ... Je peux le voir explicitement dans votre POD maintenant! Retested mon exemple ici et cela fonctionne brillamment maintenant: mon $ twig = XML :: Twig-> nparse (twig_handlers => { title => sub {print $ _-> texte}, }, 'http: // w3c. org '); – draegtun

+0

en fait, nparse et xparse ont été des expériences ratées, qui m'ont finalement conduit à la simple réécriture d'analyser pour prendre soin de tout pour vous (nouveau et déterminer le type d'analyse à utiliser) – mirod

Questions connexes