如何使用Perl将XML节点数据存储到哈希(Hash)中?
如何将XML数据存储到Perl哈希中?
你有如下XML示例数据:
<?xml version="1.0" ?> <Details date="2022-02-09" ver="1"> <VerNum>/14</VerNum> <Info> <model>S22</model> <branch name="city_1"> <stock>10000</stock> <def>1</def> </branch> <branch name="city_2"> <stock>2000</stock> <def>2</def> </branch> <branch name="city_3"> <stock>3000</stock> <def>0.3</def> </branch> </Info> </Details>
原Perl代码是把分支相关值拼接成字符串输出,现在需要改成将数据存储到哈希中,你可以按以下方式修改:
修改后的代码
use strict; use warnings; use XML::LibXML; use Data::Dumper; # 用来打印哈希结构,方便验证 my $xml_path = 'C:/ex.xml'; # 直接写本地路径即可,无需glob my $parser = XML::LibXML->load_xml(location => $xml_path); # 初始化存储数据的哈希 my %device_info; foreach my $sec ($parser->findnodes('/Details/Info')) { # 存储型号信息 $device_info{model} = $sec->findvalue('./model'); # 遍历每个branch节点,逐个存入哈希 foreach my $branch ($sec->findnodes('./branch')) { my $city_name = $branch->getAttribute('name'); $device_info{branches}{$city_name}{stock} = $branch->findvalue('./stock'); $device_info{branches}{$city_name}{def} = $branch->findvalue('./def'); } } # 打印哈希结构查看结果 print Dumper(\%device_info);
代码说明
- 我们构建了嵌套哈希:顶层哈希
%device_info包含model字段,以及一个branches子哈希 branches的键是分支的城市名(比如city_1),对应的值是另一个哈希,包含该城市的stock和def数据- 直接用
getAttribute('name')获取分支的name属性,比批量查找属性节点更直接 - 遍历每个
<branch>节点逐个处理,避免了把所有值拼接成字符串的问题
运行代码后,你会得到如下结构的哈希(Data::Dumper输出):
$VAR1 = { 'model' => 'S22', 'branches' => { 'city_1' => { 'stock' => '10000', 'def' => '1' }, 'city_2' => { 'stock' => '2000', 'def' => '2' }, 'city_3' => { 'stock' => '3000', 'def' => '0.3' } } };
之后你就能通过哈希键直接访问对应数据,比如$device_info{branches}{city_1}{stock}就能拿到city_1的库存数。
内容的提问来源于stack exchange,提问作者perlenthusiast
相关产品推荐
相关产品推荐

