将带有名称空格的xml文件中的值插入到csv文件中

时间:2018-01-15 17:16:56

标签: xml perl csv parsing

我正在尝试使用ID保存HTTP,例如

forms
'output.csv'中的

。之后,我想在我的获取请求中使用这些链接,以从管理系统获取有关设备的更多信息。

https://hostname:9060/ers/config/networkdevice/1

但在使用我的Perl脚本后,我的文件是空的。

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<ns3:searchResult total="3" xmlns:ns5="ers.ise.cisco.com" xmlns:ers-v2="ers-v2" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns3="v2.ers.ise.cisco.com">
  <ns3:resources>
    <ns5:resource id="1" 
        name="Device1">
        <link rel="self" href="https://hostname:9060/ers/config/networkdevice/1"
        type="application/xml"/>
    </ns5:resource>
    <ns5:resource id="2" 
        name="Device2">
        <link rel="self" href="https://hostname:9060/ers/config/networkdevice/2"
        type="application/xml"/>
    </ns5:resource>
    <ns5:resource id="3" 
        name="Device3">
        <link rel="self" href="https://hostname:9060/ers/config/networkdevice/3"
        type="application/xml"/>
    </ns5:resources>
</ns3:resources>
</ns3:searchResult>

我不确定,我使用的是正确的标签

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

#NOTE: Update this to contain my elements  in  CSV      
my @Fields = qw{id};

my $xml = XMLin('Get_All_Prime.xml', ForceArray => ['link']);

foreach my $link ( @{ $xml->{link} } ) { 
    print Dumper $link;

    foreach my $link ( @{ $xml->{link} } ) { 
        print join( ',', @{ $link->{href} }{@Fields} ) . "\n";
    }   
}   

open(my $out, '>', 'output.csv') or die "Output: $!\n";
foreach my $link ( @{ $xml->{link} } ) { 
    print $out join ( ',', @{$link->{href} }{@Fields} ) . "\n";
}

但在这种情况下我应该使用什么?

1 个答案:

答案 0 :(得分:6)

标准的优秀XML库是XML::LibXMLXML::Twig

do not use XML::Simple。很久以前它自己的documentation said

  

不鼓励在新代码中使用此模块。

很久以前,它自己的作者写了detailed tutorial for XML::LibXML。注意这个建议。

'href'

的示例
my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link/@href';
foreach my $href ($doc->findnodes($xpath) {
    push @links, $href->to_literal;
}

首先找到XML元素,作为示例;或者你可以直接去link_url,id

my $outfile = 'output.csv';
open my $fh_out, '>', $outfile or die "Can't open $outfile: $!";
say $fh_out 'url,id';  # header

my $xpath = '//ns3:searchResult/ns3:resources/ns5:resource/link';
my @links;
foreach my $node ($doc->findnodes($xpath)) {
    #say $node->findvalue('./@href'), ' => ', $node->findvalue('../@id');
    push @links, [ map { $node->findvalue($_) } qw(./@href ../@id) ];
}
say $fh_out join ',', @$_  for @links;

这是一个完整的库,完全支持使用t4:[[-1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0, 0,0], [0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,0 ,0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, 0, 0, 0, 0, 0, 0], ] 。请参阅this postthis post,了解从模块的广泛和结构化文档开始的位置。

我会走出困境并假设所需的CSV输出文件包含行sce=range(1,4) items=range(1,5) types= range(1,3) t4=[] t41=[] t42=[] t43=[] t44=[] t45=[] t46=[] t47=[] for i in items: for k in types: for s in sce: if i==1 and k==1: t41.append(-1) else: t41.append(0) if i==1 and k==2: t42.append(-1) else: t42.append(0) if i==2 and k==1: t43.append(-1) else: t43.append(0) if i==2 and k==2: t44.append(-1) else: t44.append(0) if i==3 and k==1: t45.append(-1) else: t45.append(0) if i==3 and k==2: t46.append(-1) else: t46.append(0) if i==4 and k==1: t46.append(-1) else: t46.append(0) if i==4 and k==2: t47.append(-1) else: t47.append(0) t4. extend (t41) t4. extend (t42) t4. extend (t43) t4. extend (t44) t4. extend (t45) t4. extend (t46) t4. extend (t47) print("t4:", t4)

{{1}}

有关CSV使用Text::CSV的更广泛工作,Text::CSV_XS的“精简包装”。