在Perl中使用嵌套和确定元素将XML转换为CSV

在Perl中使用嵌套和确定元素将XML转换为CSV,xml,perl,csv,data-conversion,Xml,Perl,Csv,Data Conversion,我需要将xml文件转换为csv格式。但在csv文件中,我不需要XML中的所有信息,只需要设备中的两个元素IP地址和id #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use XML::Simple; #Elements, that I want see in my csv my @Fields = qw{id, ipAddress}; open(my $out, '>', 'output.c

我需要将xml文件转换为csv格式。但在csv文件中,我不需要XML中的所有信息,只需要设备中的两个元素IP地址和id

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

  #Elements, that I want see in my csv
  my @Fields = qw{id, ipAddress};

  open(my $out, '>', 'output.csv') or die "Output: $!\n";
  print $out join(',', @Fields) . "\n";

  my $xml = XMLin('input.xml', ForceArray => ['entity']);
  foreach my $entity (@{$xml->{entity}}) {
  no warnings;
  print $out join(',', map{$_->{content}} @{$entity}{@Fields}) . "\n";
Input.xml

我不确定:

     my $xml = XMLin('input.xml', ForceArray => ['entity']);
     foreach my $entity (@{$xml->{entity}})

这对我来说是正确的。我应该使用标记实体吗?

在处理XML::Simple时,最好先使用它来查看数据结构

foreach my $entity ( @{ $xml->{entity} } ) {
    print Dumper $entity;
foreach my $entity ( @{ $xml->{entity} } ) {
    print join( ',', @{ $entity->{devicesDTO} }{@Fields} ) . "\n";
}
这将向您展示:

$VAR1 = {
          'url' => 'https://hostname/webacs/api/v1/data/Devices/20',
          'type' => 'Devices',
          'dtoType' => 'devicesDTO',
          'devicesDTO' => {
                          'displayName' => '20',
                          'creationTime' => '2016-02-29T17:32:13.116+01:00',
                          'warningAlarms' => '0',
                          'ipAddress' => '1.1.1.1',
                          'clearedAlarms' => '1',
                          'majorAlarms' => '0',
                          'collectionDetail' => '<status><general code="SUCCESS"/></status>',
                          'location' => {},
                          'collectionTime' => '2017-03-30T09:47:07.606+02:00',
                          'softwareType' => 'IOS',
                          'id' => '20',
                          'softwareVersion' => '12.2(55)SE9'
                        }
        };
这将产生输出

id,ipAddress
20,1.1.1.1
21,2.2.2.2
注意,在qw{}中有一个不需要的逗号。qw的思想是不需要使用逗号。您还应该决定是否希望变量使用小写字母。混合使用这种样式是不好的,Perl中的惯例是使用snake-case

my @fields = qw{id ipAddress};

在新代码中不应使用XML::Simple。它并不简单,经常是错误的,文档建议不要使用它。ipAddress是一个元素,而不是一个属性。非常感谢您的建议!它起作用了!但是我的文件output.csv是空的。我应该写openmy$out“>”、“output.csv”还是死输出:$\N打印$out加入“,”和@字段\N脚本结束时?@StayCalm您没有显示完整的代码,所以我不知道。如果您有后续问题,请以新问题的形式提问。这段代码的和平来自于那个问题,我发布了:
id,ipAddress
20,1.1.1.1
21,2.2.2.2
my @fields = qw{id ipAddress};