【问题标题】:How to parse multi record XML file ues XML::Simple in Perl如何在 Perl 中使用 XML::Simple 解析多记录 XML 文件
【发布时间】:2011-02-27 14:08:37
【问题描述】:

我的数据.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<catalog>
  <cd country="UK">
    <title>Hide your heart</title>
    <artist>Bonnie Tyler</artist>
    <price>10.0</price>
  </cd>
  <cd country="CHN">
    <title>Greatest Hits</title>
    <artist>Dolly Parton</artist>
    <price>9.99</price>
  </cd>
  <cd country="USA">
    <title>Hello</title>
    <artist>Say Hello</artist>
    <price>0001</price>
  </cd>
</catalog>

我的测试.pl

#!/usr/bin/perl

   # use module
   use XML::Simple;
   use Data::Dumper;

   # create object
   $xml = new XML::Simple;

   # read XML file
   $data = $xml->XMLin("data.xml");

   # access XML data
   print "$data->{cd}->{country}\n";
   print "$data->{cd}->{artist}\n";
   print "$data->{cd}->{price}\n";
   print "$data->{cd}->{title}\n";

输出:

Not a HASH reference at D:\learning\perl\t1.pl line 16.

评论:我用谷歌搜索并找到了这篇文章(处理单个 xml 记录)。 http://www.go4expert.com/forums/showthread.php?t=812 我用文章代码进行了测试,它在我的笔记本电脑上运行良好。

然后我在上面创建了我的练习代码来尝试访问多条记录。但失败了。我该如何解决?谢谢。

【问题讨论】:

标签: perl xml-parsing xml-simple


【解决方案1】:

总是use strict;,总是use warnings; 不要像现在这样引用复杂的引用。 use Dumper; 是对的,它应该告诉你 cd 是一个数组引用 - 你必须明确哪个 cd。

#!/usr/bin/perl
use strict;
use warnings;

# use module
use XML::Simple;
use Data::Dumper;

# create object
my $xml = new XML::Simple;

# read XML file
my $data = $xml->XMLin("file.xml");

# access XML data
print $data->{cd}[0]{country};
print $data->{cd}[0]{artist};
print $data->{cd}[0]{price};
print $data->{cd}[0]{title};

【讨论】:

  • 感谢详细剖析。
【解决方案2】:

如果你做print Dumper($data),你会看到数据结构不像你想象的那样:

$VAR1 = {
          'cd' => [
                  {
                    'country' => 'UK',
                    'artist' => 'Bonnie Tyler',
                    'price' => '10.0',
                    'title' => 'Hide your heart'
                  },
                  {
                    'country' => 'CHN',
                    'artist' => 'Dolly Parton',
                    'price' => '9.99',
                    'title' => 'Greatest Hits'
                  },
                  {
                    'country' => 'USA',
                    'artist' => 'Say Hello',
                    'price' => '0001',
                    'title' => 'Hello'
                  }
                ]
        };

您需要像这样访问数据:

print "$data->{cd}->[0]->{country}\n";
print "$data->{cd}->[0]->{artist}\n";
print "$data->{cd}->[0]->{price}\n";
print "$data->{cd}->[0]->{title}\n";

【讨论】:

    【解决方案3】:

    除了 Evan 所说的之外,如果您不确定自己是否遇到了一个或多个元素,ref() 可以告诉您它是什么,您可以相应地处理它:

    my $data = $xml->XMLin("file.xml");
    
    if(ref($data->{cd}) eq 'ARRAY')
    {
       for my $cd (@{ $data->{cd} })
       {
          print Dumper $cd;
       }
    }
    else # Chances are it's a single element
    {
       print Dumper $cd;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-21
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2015-10-09
      • 2017-10-28
      • 2011-02-24
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多