在perl中使用相同的标记解析xml

时间:2014-03-04 11:07:05

标签: xml perl

如何使用perl中的XML :: Simple解析以下xml字段

<SelectedSections>
  <Section Name="A_1" />
  <Section Name="B_1" />
</SelectedSections>

这样我就可以输出

A_1
B_1

我试过这样的事情:

#!/usr/bin/perl
use XML::Simple;
use strict;
use warnings;
use Data::Dumper;

my $xml = XML::Simple->new;
my $file1 = 'testxml';
my $data = $xml->XMLin($file1);
print $data->{SelectedSections}->{Section-> 'Name'} ,"\n";

2 个答案:

答案 0 :(得分:1)

如果不确定XML创建的数据结构是什么,请转储它。在我们的例子中,我们得到了这个:

{ Section => [{ Name => "A_1" }, { Name => "B_1" }] }

所以要打印出名字,我们必须这样做

say $data->{Section}[0]{Name};

要打印出所有部分,我们可以

for my $section (@{ $data->{Section} }) {
    say $section->{Name};
}

XML :: Simple的问题在于,预测由一段XML创建的数据结构非常困难。像XML::LibXML这样的其他XML接口更加一致(XML::LibXML使用标准化的DOM接口)。例如,我会像这样解决这个问题:

use strict;
use warnings;
use feature 'say';
use XML::LibXML;

my $xml = XML::LibXML->load_xml(location => "filename.xml");
for my $name ($xml->findnodes('/SelectedSections/Section/@Name')) {
    say $name->value;
}

传递给findnodes方法的字符串是一个XPath表达式,可用于在相当复杂的XML文档中轻松访问部分。

答案 1 :(得分:0)

使用XML::Simple,您可以按照以下方式执行此操作

my $xml = XML::Simple->new;
my $file1 = 'test.xml';
my $data = $xml->XMLin($file1);

print(Dumper($data));   

# If you print this dumper you will see that the 'SelectedSections' is not in $data

my @sections = @{$data->{Section}};

foreach my $s (@sections) {
    print($s->{Name} . "\n");
}

输出:

$VAR1 = {
          'Section' => [
                       {
                         'Name' => 'A_1'
                       },
                       {
                         'Name' => 'B_1'
                       }
                     ]
        };
A_1
B_1