Perl—遍历xml文件并存储特定标记中的数据

Perl—遍历xml文件并存储特定标记中的数据,xml,perl,xml-parsing,Xml,Perl,Xml Parsing,我需要使用Perl将XML文件中的特定数据(文件名)存储到哈希中。 我正在逐行遍历XML文件,但我一直在研究如何从schooldata的file属性中获取文件名 我尝试访问的XML部分如下所示: <name number="5"> <description> <schooldata file="/home/matt/.01"></schooldata> </description> <des

我需要使用Perl将XML文件中的特定数据(文件名)存储到哈希中。 我正在逐行遍历XML文件,但我一直在研究如何从
schooldata
file
属性中获取文件名

我尝试访问的XML部分如下所示:

<name number="5">
    <description>
        <schooldata file="/home/matt/.01"></schooldata>
    </description>
    <description>
        <schooldata file="/home/matt/.02"></schooldata>
    </description>
    <description>
        <schooldata file="/home/matt/0.3"></schooldata>
    </description>
    <description>
        <schooldata file="/home/matt/0.4"></schooldata>
    </description>
</name>
...
<name number="10">
...
</name>

...
...

使用警告;
严格使用;
使用XML::Twig;
my$twig=新XML::twig(
细枝处理程序=>{
学校数据=>\&学校数据
}
);
我的%s文件;
$twig->parse(q(
));
使用数据::转储程序;
$Data::Dumper::Sortkeys=1;
打印转储程序(\%文件);
次级学校数据{
我的($twig,$data)=@;
$files{$data->att('file')}++;
}
__结束__
$VAR1={
'/home/matt/.01'=>1,
'/home/matt/.02'=>1,
'/home/matt/0.3'=>1,
'/home/matt/0.4'=>1
};
xml.xml:

<?xml version="1.0" encoding="UTF-8"?>
<names>
<name number="5">
          <description>
                      <schooldata file="/home/matt/.01"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/matt/.02"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/matt/0.3"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/matt/0.4"></schooldata>
          </description>
</name>

<name number="6">
          <description>
                      <schooldata file="/home/betty/.01"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/betty/.02"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/betty/0.3"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/betty/0.4"></schooldata>
          </description>
</name>
</names>

$line='';
如果($line=~/schooldata file=“([^”]+)”/)打印$1;

那么文件名应该是您想要构建的哈希值?那么键呢?您不使用XML解析器有什么特别令人信服的原因吗?
use strict; 
use warnings; 
use 5.014; 

use XML::LibXML;

my $filename = "xml.xml";
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($filename);

my %results;

for my $name ($doc->findnodes('/names/name')) {
    my $num = $name->getAttribute('number');

    for my $school ($name->findnodes('description/schooldata')) {
        push @{$results{$num}}, $school->getAttribute('file');
    }
}

use Data::Dumper;
say Dumper(\%results);


--output:--
$VAR1 = {
          '6' => [
                 '/home/betty/.01',
                 '/home/betty/.02',
                 '/home/betty/0.3',
                 '/home/betty/0.4'
               ],
          '5' => [
                 '/home/matt/.01',
                 '/home/matt/.02',
                 '/home/matt/0.3',
                 '/home/matt/0.4'
               ]
        };
<?xml version="1.0" encoding="UTF-8"?>
<names>
<name number="5">
          <description>
                      <schooldata file="/home/matt/.01"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/matt/.02"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/matt/0.3"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/matt/0.4"></schooldata>
          </description>
</name>

<name number="6">
          <description>
                      <schooldata file="/home/betty/.01"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/betty/.02"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/betty/0.3"></schooldata>
          </description>
          <description>
                      <schooldata file="/home/betty/0.4"></schooldata>
          </description>
</name>
</names>
$line = '<schooldata file="/home/matt/.01"></schooldata>';
print $1 if ($line =~ /schooldata file="([^"]+)"/);