XML :: Simple, узлы XML превратились в значения узлов name - PullRequest
0 голосов
/ 22 марта 2012

Я использую Perl с XML :: Simple для преобразования хеша в документ XML.

Мой скрипт выглядит следующим образом:

#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml_simple = XML::Simple->new( NoAttr => 1,
                   KeepRoot => 1);

my $hash = { output => { 'products' => [ { 'product' => { 'titel' => 'ABN AMRO Bank hypotheken',
                                                          'owner' => 'ABN AMRO Hypotheken Groep',
                                                          'code' => 'ABN AMRO BANK R' } },
                                         { 'product' => { 'titel' => 'Aegon',
                                                          'owner' => 'AEGON Hypotheken',
                                                          'code' => 'AEGON pilot' } } ],
                         'date' => '2012-02-20'} };


my $xml = $xml_simple->XMLout( $hash );

print Dumper( $xml );

Вывод, который я получаю:

<output>
  <date>2012-02-20</date>
  <products>
      <name>product</name>
      <code>ABN AMRO BANK R</code>
      <owner>ABN AMRO Hypotheken Groep</owner>
      <titel>ABN AMRO Bank hypotheken</titel>
  </products>
  <products>
      <name>product</name>
      <code>AEGON pilot</code>
      <owner>AEGON Hypotheken</owner>
      <titel>Aegon</titel>
  </products>
</output>

но что я ищу, это (см. Узлы 'product'):

<output>
  <date>2012-02-20</date>
  <products>
    <product>
      <code>ABN AMRO BANK R</code>
      <owner>ABN AMRO Hypotheken Groep</owner>
      <titel>ABN AMRO Bank hypotheken</titel>
    </product>
    <product>
      <code>AEGON pilot</code>
      <owner>AEGON Hypotheken</owner>
      <titel>Aegon</titel>
    </product>
  </products>
</output>

Это выполнимо с XML :: Simple, или я должен использовать другой модуль?

1 Ответ

3 голосов
/ 22 марта 2012

Вы можете позволить XML :: Simple сказать вам, какую структуру данных он хочет

#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $desired_xml = << 'END';
<myxml>
<output>
  <date>2012-02-20</date>
  <products>
    <product>
      <code>ABN AMRO BANK R</code>
      <owner>ABN AMRO Hypotheken Groep</owner>
      <titel>ABN AMRO Bank hypotheken</titel>
    </product>
    <product>
      <code>AEGON pilot</code>
      <owner>AEGON Hypotheken</owner>
      <titel>Aegon</titel>
    </product>
  </products>
</output>
</myxml>
END
#print $desired_xml;
my $xml_simple = XML::Simple->new(
    NoAttr   => 1,
    KeepRoot => 1
);
#my $hash = XMLin( $desired_xml, forcearray => 1 );
my $hash = {
    output => [
        {
            date     => ["2012-02-20"],
            products => [
                {
                    product => [
                        {
                            code  => ["ABN AMRO BANK R"],
                            owner => ["ABN AMRO Hypotheken Groep"],
                            titel => ["ABN AMRO Bank hypotheken"],
                        },
                        {
                            code  => ["AEGON pilot"],
                            owner => ["AEGON Hypotheken"],
                            titel => ["Aegon"],
                        },
                    ],
                },
            ],
        },
    ],
  };
#print Data::Dumper->Dump( [$hash], [qw(hash)] );
my $xml = $xml_simple->XMLout($hash);
print Data::Dumper->Dump( [$xml], [qw(xml)] );
...