如何使用XML::Twig从URL提取一些XML数据?

4

我想从从一个URL获取的XML中获取特定的字符串,例如在<received>123</received>中获取123。

我已经编写了代码,但遇到了错误信息:

尝试将引用转换为对象失败,位于/usr/share/perl5/XML/Twig.pm第392行。

我该如何解决这个问题?

代码如下:

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
顺便提一下,有关为什么使用 new XML::Twig 不好而且推荐使用 XML::Twig->new 的解释请参考以下回答:https://dev59.com/t3RC5IYBdhLWcg3wCMnX#429798 - friedo
谢谢您的建议。我用我的 $twig = XML::Twig->new( Twig_Roots => { ... }}); 重写了它,现在运行得很好 :) - conandor
2个回答

6
nparse会为您处理new(因此有“n”),在这种情况下,您可能需要xparse,或者只需让模块自己找出并执行以下操作:
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

谢谢mirod。它与xparse很好地配合使用。顺便说一下,$twig->print仅用于调试。实际上,我只想要$author的值。 - conandor

3
似乎方法存在一个错误,因为如果你用以下代码替换那一行:
$twig->parse( LWP::Simple::get($url) );

那么你应该会发现它正常工作(或者当我尝试时是这样的)。

/I3az/


这不是nparse的bug,而是调用方式的bug ;--) - mirod
啊,是的...我现在可以明确地在你的POD中看到它了!我在这里重新测试了我的示例,现在它运行得非常出色:my $twig = XML::Twig->nparse( twig_handlers => { title => sub { print $_->text }, }, 'http://w3c.org'); - draegtun
@mirod:让我借此机会真诚地说一声“谢谢”你的XML::Twig。多年来,它一直是一个令人愉快、强大且有时拯救生命的工具。你的Barry - draegtun
PS. 这在解决其他工作问题的同时,对于完成工作非常“救命”。;-) - draegtun
以前尝试过这段代码,但似乎无法在TwigRoots中正常工作。 - conandor
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接