我正在尝试将一个值写入XML文件。我有一个CSV输入文件Input.xsv和一个template.xml模板文件,我需要用CSV文件中的名称和IP地址值来更新它们。
Input.csv (名称,IP地址)
LAB-1,10.26.0.1
LAB-2,10.26.0.2
LAB-3,10.26.0.3template.xml
<?xml version="1.0" encoding="UTF-8"?>
<ns0:networkdevice
xmlns:ns0="network.ers.ise.cisco.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="ers.ise.cisco.com"
xmlns:ers="ers.ise.cisco.com"
name="name1">
<authenticationSettings>
<enableKeyWrap>true</enableKeyWrap>
<keyEncryptionKey>1234567890123456</keyEncryptionKey>
<keyInputFormat>ASCII</keyInputFormat>
<networkProtocol>RADIUS</networkProtocol>
<radiusSharedSecret>aaa</radiusSharedSecret>
</authenticationSettings>
<coaPort>1700</coaPort>
<NetworkDeviceIPList>
<NetworkDeviceIP>
<ipaddress>1.1.1.1</ipaddress>
<mask>32</mask>
</NetworkDeviceIP>
</NetworkDeviceIPList>
</ns0:networkdevice>我希望从CSV文件中读取名称和IP地址,并将它们写入我的XML模板文件中,为CSV文件中的每个设备创建一个HTTP请求。
我试图在我的XML模板中保存这些值,但我不确定我是否做得对。
#!/usr/bin/perl
use warnings;
use strict;
use Text::CSV;
use XML::TreeBuilder;
use Data::Dumper;
my $xmlbase = 'template.xml';
my $paramsfile = 'input.csv';
# The list of tags filled from the CSV file
my @taglist = qw( name ipaddress );
my $tree = XML::TreeBuilder->new();
$tree->parsefile($xmlbase);
my $csv = Text::CSV->new();
open my $fh, "<:encoding(utf8)", $paramsfile or die "$paramsfile: $!";
while ( my $row = $csv->getline($fh) ) {
my $contree = XML::TreeBuilder->new();
$contree->parsefile($xmlbase);
my $index = 0;
for my $tagname ( @taglist ) {
my $tag = $contree->look_down('_tag' => $tagname);
$tag->push_content($row->[$index++]);
}
}
print '<?xml version="1.0" encoding="UTF-8"?>'."\n";
print $tree->as_XML();运行脚本后,会得到以下错误:
无法在该行中找到对象方法“push_content”
此错误引用语句$tag->push_content($row->[$index++]);。我认为这是因为name没有自己的标记。
我这里有这样的元素:
<ns0:networkdevice
xmlns:ns0="network.ers.ise.cisco.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ns1="ers.ise.cisco.com"
xmlns:ers="ers.ise.cisco.com"
name="name1">标签内ns0:networkdevice
当我尝试使用ipaddress时,它会被打印出来,但是使用来自template.xml的原始值。它不接受Input.csv的值,如果是空的,则保持为空。
我该怎么做?
发布于 2018-01-31 10:50:24
我对XML::Treebuilder还不太熟悉,所以将在XML::Twig中给出一个例子。我还将避免使用Text::CSV,因为我认为这对大多数CSV用例来说都是过分的(例如,您不必担心引用/多行)。
但它会是这样的:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml = XML::Twig -> new -> parsefile ( 'template.xml' );
$xml ->set_pretty_print('indented_a');
open ( my $input, '<', 'input.csv' ) or die $!;
while ( <$input> ) {
chomp;
my ( $name, $ip ) = split /,/;
$xml -> root -> set_att('name', $name );
$xml -> get_xpath('//ipaddress',0) -> set_text($ip);
$xml -> print;
}对于CSV的最后一行,这将生成:
<?xml version="1.0" encoding="UTF-8"?>
<ns0:networkdevice
name="LAB-3"
xmlns:ers="ers.ise.cisco.com"
xmlns:ns0="network.ers.ise.cisco.com"
xmlns:ns1="ers.ise.cisco.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<authenticationSettings>
<enableKeyWrap>true</enableKeyWrap>
<keyEncryptionKey>1234567890123456</keyEncryptionKey>
<keyInputFormat>ASCII</keyInputFormat>
<networkProtocol>RADIUS</networkProtocol>
<radiusSharedSecret>aaa</radiusSharedSecret>
</authenticationSettings>
<coaPort>1700</coaPort>
<NetworkDeviceIPList>
<NetworkDeviceIP>
<ipaddress>10.26.0.3</ipaddress>
<mask>32</mask>
</NetworkDeviceIP>
</NetworkDeviceIPList>
</ns0:networkdevice>你想要的是什么?
但是,如果您想将$xml -> sprint包含在POST或类似的系统中,您就需要它了。
发布于 2018-01-31 11:37:56
从Perl生成XML的一种简单方法是使用XML::FromPerl。
模板被嵌入在代码中的Perl数据结构所取代:
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use XML::FromPerl qw(xml_from_perl);
my $name = 'LAB-1';
my $ip = '10.26.0.1';
my $xml = xml_from_perl
[ 'ns0:networkdevice' => { 'xmlns:ns0' => 'network.ers.ise.cisco.com',
'xmlns:xs' => 'http://www.w3.org/2001/XMLSchema',
'xmlns:ns1' => 'ers.ise.cisco.com',
'xmlns:ers' => 'ers.ise.cisco.com',
name => $name },
[ authenticationSettings =>
[ enableKeyWrap => 'true' ],
[ keyEncryptionKey => '1234567890123456' ],
[ keyInputFormat => 'ASCII' ],
[ networkProtocol => 'RADIUS' ],
[ radiusSharedSecret => 'aaa' ] ],
[ coaPort => '1700' ],
[ NetworkDeviceIPList =>
[ NetworkDeviceIP =>
[ ipaddress => $ip ],
[ mask => 32 ] ] ] ];
say $xml->toString(1);https://stackoverflow.com/questions/48539298
复制相似问题