检测空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 我怎样

我有以下代码来通读包含以下元素的XML文件

<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