perl 提取XML文件中的值

bgibtngc  于 2023-10-24  发布在  Perl
关注(0)|答案(1)|浏览(146)

这是我的XML格式:

<A>
  <B>
    <C>..</C>
    <D>..</D>
    <E>..</E>
  </B>
</A>

下面是我的代码:

use strict;
use warnings;
use Data::Dumper;
use XML::Simple;
open(my $fh, '<', '/tmp/abc.xml');
my $xml = new XML::Simple;
my $data = $xml->XMLin($fh) or die "Failed to find $fh";
my $value = $data->{'B'};
print $value->{'C'}

给出错误:
不是HASH引用。
你能解释一下我哪里做错了吗?

t2a7ltrp

t2a7ltrp1#

你在以下几个方面犯了错误:首先,使用一个过时的XML解析模块,其文档中充满了警告不要使用它,并且没有使用一个XML表达式来获取你想要的数据。下面的代码使用了XML::LibXML

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use XML::LibXML;

my $xml = XML::LibXML->load_xml(IO => \*DATA);
# my $xml = XML::LibXML->load_xml(location => '/tmp/abc.xml');

my @nodes = $xml->findnodes('/A/B/C');
for my $node (@nodes) {
    say $node->textContent();
}

__DATA__
<A>
  <B>
    <C>..</C>
    <D>..</D>
    <E>..</E>
  </B>
</A>

或者使用XML::Twig

#!/usr/bin/env perl
use warnings;
use strict;
use feature qw/say/;
use XML::Twig;

my $twig =
    XML::Twig->new(twig_handlers => { '/A/B/C' => sub { say $_[1]->text } });

$twig->parse(\*DATA);
# $twig->parsefile('/tmp/abc.xml');

__DATA__
<A>
  <B>
    <C>..</C>
    <D>..</D>
    <E>..</E>
  </B>
</A>

相关问题