使用 XMLin 解析嵌套的 XML
Parsing nested XML using XMLin
我花了几个小时试图弄清楚如何使用 XMLin 来理解这个嵌套的 XML 但没有成功。我也试过这个网站上的例子;我怎样才能获得传递的 lca-data 并遍历前缀?
转储程序输出在这里:http://pastebin.com/a4N8AtX1
简单代码:
$url = "http://www.localcallingguide.com/xmllocalprefix.php?npa=514&nxx=307";
$xml = new XML::Simple;
$data = $xml->XMLin(&getURL($url), ForceArray => [qw( lca-data prefix )]);
print Dumper( $data );
foreach $e (@{$data->{prefix}}) {
print STDERR $e->{npa} . "\n";
}
它没有输出...
提前致谢
首先 - 真的 - 阅读 XML::Simple
的联机帮助页。特别要注意上面写的那一点:
The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces.
另外 - 不要在子例程调用前使用 &
- 它们通常是一个坏主意 - 使用它们有一些非常具体的原因,但不是一个。
并且您应该始终使用strict
和warnings
,尤其是在发布代码供其他人查看时。
鉴于您的任务似乎是将每个 npa
元素输出到 STDERR
,我建议您可以这样处理它 - 使用 XML::Twig
而不是 XML::Simple
#!/usr/bin/local/perl
use warnings;
use strict;
use LWP::Simple;
use XML::Twig;
my $url =
'http://www.localcallingguide.com/xmllocalprefix.php?npa=514&nxx=307';
my $twig = XML::Twig->new(
'twig_handlers' => {
'npa' => sub { print STDERR $_->text, "\n"; }
}
);
$twig->parse( get($url) );
它在每个 npa
子元素上将处理程序设置为 'trigger' 并打印它 - 它在解析 XML 时执行此操作,这意味着您可以做一些非常巧妙的技巧比如在解析时修改它(例如删除或移动元素)。
如果您希望简单地迭代一个元素,那么您可以那样做 - 这有一个很好的优势,即不使用大量内存,因为 XML 可以。 (XML::Twig 有 purge
可以让你丢弃任何处理过的 XML)。
否则,有 'children' 或 'get_xpath' 选项:
my $twig = XML::Twig->new()->parse( get($url) );
foreach
my $prefix ( $twig->root->first_child('lca-data')->children('prefix') )
{
print $prefix ->first_child_text('npa'), "\n";
}
### alternatively:
foreach my $prefix ( $twig->root->get_xpath('./lca-data/prefix') ) {
print $prefix ->first_child_text('npa'), "\n";
}
如果您想使用子程序来处理和清除,您可以这样做:
sub process_prefix {
my ( $twig, $prefix ) = @_;
print $prefix ->first_child_text('npa'), "\n";
$twig->purge; #clears already parsed data - good if your XML is large!
}
my $url =
'http://www.localcallingguide.com/xmllocalprefix.php?npa=514&nxx=307';
my $twig =
XML::Twig->new( 'twig_handlers' => { 'prefix' => \&process_prefix } )
->parse( get($url) );
使用解析器进行 XML 解析做得很好。但是看看 XML::Twig
或 XML::LibXML
而不是 XML::Simple
- 它们都是更好的工作工具。 (XML::Twig
甚至有 simpify
方法,如果你真的需要它来实现向后兼容性,它几乎可以复制 XML::Simple
)
但是你的问题的解决方案是:
foreach $e (@{ $data->{'lca-data'}[0]{'prefix'} } {
我花了几个小时试图弄清楚如何使用 XMLin 来理解这个嵌套的 XML 但没有成功。我也试过这个网站上的例子;我怎样才能获得传递的 lca-data 并遍历前缀?
转储程序输出在这里:http://pastebin.com/a4N8AtX1
简单代码:
$url = "http://www.localcallingguide.com/xmllocalprefix.php?npa=514&nxx=307";
$xml = new XML::Simple;
$data = $xml->XMLin(&getURL($url), ForceArray => [qw( lca-data prefix )]);
print Dumper( $data );
foreach $e (@{$data->{prefix}}) {
print STDERR $e->{npa} . "\n";
}
它没有输出...
提前致谢
首先 - 真的 - 阅读 XML::Simple
的联机帮助页。特别要注意上面写的那一点:
The use of this module in new code is discouraged. Other modules are available which provide more straightforward and consistent interfaces.
另外 - 不要在子例程调用前使用 &
- 它们通常是一个坏主意 - 使用它们有一些非常具体的原因,但不是一个。
并且您应该始终使用strict
和warnings
,尤其是在发布代码供其他人查看时。
鉴于您的任务似乎是将每个 npa
元素输出到 STDERR
,我建议您可以这样处理它 - 使用 XML::Twig
而不是 XML::Simple
#!/usr/bin/local/perl
use warnings;
use strict;
use LWP::Simple;
use XML::Twig;
my $url =
'http://www.localcallingguide.com/xmllocalprefix.php?npa=514&nxx=307';
my $twig = XML::Twig->new(
'twig_handlers' => {
'npa' => sub { print STDERR $_->text, "\n"; }
}
);
$twig->parse( get($url) );
它在每个 npa
子元素上将处理程序设置为 'trigger' 并打印它 - 它在解析 XML 时执行此操作,这意味着您可以做一些非常巧妙的技巧比如在解析时修改它(例如删除或移动元素)。
如果您希望简单地迭代一个元素,那么您可以那样做 - 这有一个很好的优势,即不使用大量内存,因为 XML 可以。 (XML::Twig 有 purge
可以让你丢弃任何处理过的 XML)。
否则,有 'children' 或 'get_xpath' 选项:
my $twig = XML::Twig->new()->parse( get($url) );
foreach
my $prefix ( $twig->root->first_child('lca-data')->children('prefix') )
{
print $prefix ->first_child_text('npa'), "\n";
}
### alternatively:
foreach my $prefix ( $twig->root->get_xpath('./lca-data/prefix') ) {
print $prefix ->first_child_text('npa'), "\n";
}
如果您想使用子程序来处理和清除,您可以这样做:
sub process_prefix {
my ( $twig, $prefix ) = @_;
print $prefix ->first_child_text('npa'), "\n";
$twig->purge; #clears already parsed data - good if your XML is large!
}
my $url =
'http://www.localcallingguide.com/xmllocalprefix.php?npa=514&nxx=307';
my $twig =
XML::Twig->new( 'twig_handlers' => { 'prefix' => \&process_prefix } )
->parse( get($url) );
使用解析器进行 XML 解析做得很好。但是看看 XML::Twig
或 XML::LibXML
而不是 XML::Simple
- 它们都是更好的工作工具。 (XML::Twig
甚至有 simpify
方法,如果你真的需要它来实现向后兼容性,它几乎可以复制 XML::Simple
)
但是你的问题的解决方案是:
foreach $e (@{ $data->{'lca-data'}[0]{'prefix'} } {