我有简单的xml为哪个转储器生成,我需要将xml转换为hash,我使用的是XML :: Simple包,我怎样才能实现它。 基本上我需要从{var1} {server1} {servername}
获取哈希值use XML::Simple;
use Data::Dumper;
my $filename="config.xml";
open(my $fh,'<:encoding(UTF-8)',$filename)
or die "could not open the file:$filename";
my $ref = XMLin($xml, ForceArray => 1);
print Dumper($ref);
$VAR1 = {
'server2' => [
{
'servername' => [
'ICE'
],
'user' => [
'csftplc1'
],
'ipaddress' => [
'199.53.9.51'
]
}
],
'server1' => [
{
'servername' => [
'DMZ '
],
'user' => [
'csftplch'
],
'ipaddress' => [
'199.53.9.50'
]
}
],
'id_name' => '317D'
};
<?xml version="1.0" encoding="UTF-8"?>
<job id_name="317D">
<server1>
<servername>DMZ </servername>
<ipaddress>199.53.9.50</ipaddress>
<user>csftplch</user>
</server1>
<server2>
<servername>ICE</servername>
<ipaddress>199.53.9.51</ipaddress>
<user>csftplc1</user>
</server2>
</job>
答案 0 :(得分:3)
如果您删除ForceArray
选项并使用默认设置,那么XML::Simple
将按照您的要求执行操作。但是,对于新代码,您应该使用XML::Simple
之外的其他内容,因为它有很多问题
use strict;
use warnings;
use XML::Simple;
my $ref = XMLin(\*DATA);
print $ref->{server1}{servername}, "\n";
print $ref->{server2}{servername}, "\n";
__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<job id_name="317D">
<server1>
<servername>DMZ </servername>
<ipaddress>199.53.9.50</ipaddress>
<user>csftplch</user>
</server1>
<server2>
<servername>ICE</servername>
<ipaddress>199.53.9.51</ipaddress>
<user>csftplc1</user>
</server2>
</job>
<强>输出强>
DMZ
ICE
答案 1 :(得分:2)
正如Dumper输出显示的那样,ForceArray在途中创建了一些数组。
my $name = $ref->{server1}[0]{servername}[0];
这就是为什么即使是XML::Simple的文档也会发出警告的原因之一。