【问题标题】:How to use XML::LibXML to parse an XML document and build a Perl hash如何使用 XML::LibXML 解析 XML 文档并构建 Perl 哈希
【发布时间】:2015-02-04 09:30:36
【问题描述】:

我有这样的 XML 数据

<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 哈希,如下所示。每个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();

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

【问题讨论】:

  • 您有问题吗?
  • 是的,我无法读取这些值并创建相同的哈希结构

标签: perl


【解决方案1】:

这个程序按你的要求做。它从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" },
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-12
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多