You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:55:32