在Perl中使用嵌套和确定元素将XML转换为CSV
我需要将xml文件转换为csv格式。但在csv文件中,我不需要XML中的所有信息,只需要设备中的两个元素IP地址和id在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
#!/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};