Perl简单的xml问题

时间:2011-02-05 20:30:10

标签: xml perl

我正在尝试解析我创建的一个简单的XML文件......它看起来像这样:

<project name="AU" date="2/2/2011" location="proj1">
  <GenomeList name="Processed">
    <genome name="AU4" />
  </GenomeList>
  <GenomeList name="Unprocessed">
      <genome name="AU1" />
      <genome name="AU2" />
      <genome name="AU3" />
  </GenomeList>
</project>

我遇到的问题是解析基因组列表:似乎当列表中只有一个元素时,它会以不同的方式添加条目,如下所示:

'Unprocessed' => {
                  'genome' => {
                              'AU2' => {},
                              'AU3' => {},
                              'AU1' => {}
                              }
                 },
'Processed' => {
                'genome' => {
                            'name' => 'AU4'
                            }
               }

有什么办法可以让它以一致的方式解析吗?

我尝试使用valueAttr但它似乎没有工作

由于

1 个答案:

答案 0 :(得分:5)

使用XML::Simple这是一个非常常见的问题,所以我猜这就是你正在使用的。 ForceArray可能会做你想要的。请参阅下面的示例和输出;第三个印刷语句应该做你想要的。请注意,一旦您的使用扩展到琐碎和可预测的输入/输出内容之外,XML :: Simple绝对不简单。如果您想使用它,请不要在“简单”一词中停止阅读其文档。

XML::LibXML或者XML::Twig也非常值得学习。

use warnings;
use strict;
use XML::Simple;
use Data::Dumper;
$Data::Dumper::Terse = 1;
$Data::Dumper::Indent = 1;

my $multi = <<"";
<project name="AU" date="2/2/2011" location="proj1">
  <GenomeList name="Processed">
    <genome name="AU4" />
  </GenomeList>
  <GenomeList name="Unprocessed">
      <genome name="AU1" />
      <genome name="AU2" />
      <genome name="AU3" />
  </GenomeList>
</project>

my $single = <<"";
<project name="AU" date="2/2/2011" location="proj1">
  <GenomeList name="Processed">
    <genome name="AU4" />
  </GenomeList>
  <GenomeList name="Unprocessed">
      <genome name="AU1" />
  </GenomeList>
</project>

print Dumper( XMLin($multi) );
print Dumper( XMLin($single) );
print Dumper( XMLin( $single, ForceArray => 1 ) );