如何将xml转换为哈希并从中检索值

时间:2015-04-24 13:38:38

标签: perl

我有简单的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'
    };

config.xml中

<?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>

2 个答案:

答案 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的文档也会发出警告的原因之一。