检测空xml元素
我有以下代码来通读包含以下元素的XML文件检测空xml元素,xml,perl,xml-parsing,Xml,Perl,Xml Parsing,我有以下代码来通读包含以下元素的XML文件 <byline>name</byline> <display_title>title</display_title> <mpaa_rating>PG</mppa_rating> 出现的问题是,如果找到空元素,程序将继续在同一行上打印。e、 g当程序到达时,输出将为 name->title->name。如果找到评级,我希望程序打印name->title->no Rating 我怎样
<byline>name</byline>
<display_title>title</display_title>
<mpaa_rating>PG</mppa_rating>
出现的问题是,如果找到空元素,程序将继续在同一行上打印。e、 g当程序到达
时,输出将为
name->title->name
。如果找到评级,我希望程序打印name->title->no Rating
我怎样才能做到这一点呢?您不应该使用XML::DOM,它很旧,速度慢,维护也很差。改用,或 代码与XML::LibXML非常相似。您只需在上次测试中添加一个else:
if($review->getTagName eq 'mpaa_rating'){#name of tag
print $child->getNodeValue.";\n";
}
else {
print "no;\n";
}
使用XML::Twig,下面是代码:
#!/usr/bin/perl
use strict;
use warnings;
use 5.10.0;
use XML::Twig;
XML::Twig->new( twig_handlers => { review => \&review, })
->parse( \*DATA); # replace with ->parsefile( 'file.xml') to parse a file
sub review
{ my( $t, $review)= @_;
my @values;
foreach my $field ( qw( byline display_title mpaa_rating))
{ push @values, $review->field( $field) || 'no'; }
say join( "->", @values), ";";
}
__DATA__
<doc>
<review>
<byline>name</byline>
<display_title>title</display_title>
<mpaa_rating>PG</mpaa_rating>
</review>
<review>
<byline>name 1</byline>
<display_title>title 1</display_title>
<mpaa_rating/>
</review>
</doc>
#/usr/bin/perl
严格使用;
使用警告;
使用5.10.0;
使用XML::Twig;
XML::Twig->new(Twig\u处理程序=>{review=>\&review,})
->解析(\*数据);#替换为->parsefile('file.xml')以解析文件
次级审查
{my($t,$review)=@;
我的价值观;
foreach my$字段(qw(署名显示\标题mpaa \评级))
{push@values,$review->field($field)| |“no”}
说join(“->”,@values),“;”;
}
__资料__
名称
标题
PG
名字1
标题1
自2005年以来未更新或维护。它在bug跟踪器中标记为10年前的重要错误。建议不要使用此模块
两个更好的选择是和mirod
已经提供了前者的实现。以下是后者的一个例子:
use strict;
use warnings;
use XML::LibXML;
my $dom = XML::LibXML->load_xml(IO => \*DATA);
for my $review ($dom->findnodes('//review')) {
my @values = map {$review->findvalue($_) || 'no'} qw(byline display_title mpaa_rating);
print join("->", @values), "\n";
}
__DATA__
<root>
<review>
<byline>name</byline>
<display_title>title</display_title>
<mpaa_rating>PG</mpaa_rating>
</review>
<review>
<byline>name 1</byline>
<display_title>title 1</display_title>
<mpaa_rating/>
</review>
</root>
use strict;
use warnings;
use XML::LibXML;
my $dom = XML::LibXML->load_xml(IO => \*DATA);
for my $review ($dom->findnodes('//review')) {
my @values = map {$review->findvalue($_) || 'no'} qw(byline display_title mpaa_rating);
print join("->", @values), "\n";
}
__DATA__
<root>
<review>
<byline>name</byline>
<display_title>title</display_title>
<mpaa_rating>PG</mpaa_rating>
</review>
<review>
<byline>name 1</byline>
<display_title>title 1</display_title>
<mpaa_rating/>
</review>
</root>
name->title->PG
name 1->title 1->no