Извлечь подмножество XML с XML :: Twig - PullRequest
0 голосов
/ 30 июня 2018

Я пытаюсь использовать 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' },
)

Я не уверен, как перебрать данные, чтобы извлечь это.

1 Ответ

0 голосов
/ 30 июня 2018

Ваша структура имеет два уровня, поэтому вам нужно два уровня циклов.

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'
          }
        ];
...