使用 XML::Twig 提取 XML 的子集

Extract subset of XML with XML::Twig

我正在尝试使用 XML::Twig 提取 XML 文档的子集,以便我可以将其转换为 CSV。

这是我的数据示例

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Actions>
  <Click>
    <Field1>Data1</Field1>
    <Field2>Data2</Field2>
  </Click>
  <Click>
    <Field1>Data3</Field1>
    <Field2>Data4</Field2>
  </Click>
</Actions>

这是对预期结果进行编码的尝试

#!/usr/bin/env perl

use strict;
use warnings;

use XML::Twig;
use Text::CSV; # later
use Data::Dumper;

my $file = shift @ARGV or die "Need a file to process: $!";

my $twig = XML::Twig->new();
$twig->parsefile($file);
my $root = $twig->root;

my @data;

for my $node ( $twig->findnodes( '//Click/*' ) ) {
  my $key = $node->name;
  my $val = $node->text;
  push @data, { $key => $val }
}

print Dumper \@data;

这给出了

$VAR1 = [
          {
            'Field1' => 'Data1'
          },
          {
            'Field2' => 'Data2'
          },
          {
            'Field1' => 'Data3'
          },
          {
            'Field2' => 'Data4'
          }
        ];

我要创建的是一个哈希数组,如果这样最好的话

my @AoH = (
    { Field1 => 'Data1', Field2 => 'Data2' },
    { Field1 => 'Data3', Field2 => 'Data4' },
)

我不确定如何遍历数据来提取它。

你的结构有两层,所以你需要两层循环。

my @data;
for my $click_node ( $twig->findnodes( '/Actions/Click' ) ) {
   my %click_data;
   for my $child_node ( $click_node->findnodes( '*' ) ) {
      my $key = $child_node->name;
      my $val = $child_node->text;
      $click_data{$key} = $val;
   }

   push @data, \%click_data;
}

local $Data::Dumper::Sortkeys = 1;
print(Dumper(\@data));

输出:

$VAR1 = [
          {
            'Field1' => 'Data1',
            'Field2' => 'Data2'
          },
          {
            'Field1' => 'Data3',
            'Field2' => 'Data4'
          }
        ];