2014-12-06 69 views
1

我有一个会是这样如何使用XML ::的libxml解析XML文档并构建一个Perl哈希

<Root> 
    <Bag Identifier="1"> 
    <Code Amount="0" Code="XA" Conversion="0" Currency="INR" Desc="" Id="1"/> 
    </Bag> 
    <Bag Identifier="2"> 
    <Code Amount="21" Code="XA" Conversion="0" Currency="INR" Desc="" Id="2"/> 
    </Bag> 
</Root> 

我要分析此和下面创建一个Perl哈希XML数据。每个Bag元素的Identifier属性应该是主散列键。

'2' => { 
    'Amount' => "21", 
    'Code' => "XA", 
    'Currency' => "INR", 
} 
'1' => { 
    'Amount' => "0", 
    'Code' => "XA", 
    'Currency' => "INR", 
} 

这是我的Perl代码

my $parser = XML::LibXML->new(); 
my $xml_doc = $parser->parse_string($response); 

my $test_node = $xml_doc->findnodes('//Bag/'); 
print Dumper($test_node); 

print $test_node->find('@Id')->string_value(); 

如何创建我所描述的哈希?

+0

你有问题吗? – Borodin 2014-12-06 06:31:38

+0

是的,我无法读取值并创建相同的散列结构 – Developer 2014-12-06 06:32:41

回答

4

该程序按您的要求操作。它从DATA文件句柄中读取样本数据的副本,并使用Data::Dump来显示结果数据结构。

use strict; 
use warnings; 

use XML::LibXML; 

my $data = XML::LibXML->load_xml(IO => \*DATA); 

my %data; 

my @bags = $data->findnodes('/Root/Bag'); 

for my $bag (@bags) { 

    my $id = $bag->getAttribute('Identifier'); 

    my ($code) = $bag->getChildrenByTagName('Code'); 

    my %item; 
    for my $attr (qw/ Amount Code Currency /) { 
    $item{$attr} = $code->getAttribute($attr); 
    } 
    $data{$id} = \%item; 
} 

use Data::Dump; 
dd \%data; 

__DATA__ 
<Root> 
    <Bag Identifier="1"> 
    <Code Amount="0" Code="XA" Conversion="0" Currency="INR" Desc="" Id="1"/> 
    </Bag> 
    <Bag Identifier="2"> 
    <Code Amount="21" Code="XA" Conversion="0" Currency="INR" Desc="" Id="2"/> 
    </Bag> 
</Root> 

输出

{ 
    1 => { Amount => 0, Code => "XA", Currency => "INR" }, 
    2 => { Amount => 21, Code => "XA", Currency => "INR" }, 
}