LINUX.ORG.RU

Помогите разобрать XML

 , ,


0

1

Есть XML:

<data>
 <content id="1">
  <text1>qqq</text1>
  <text1>qqd</text1>
  <text2>www</text2>
 </content>
 <content id="2">
  <text1>qqq</text1>
  <text2>www</text2>
  <text2>wwe</text2>
 </content>
</data>

Не получается перлом это всё перенести в ексель в виде:

| id | text1 | text2 |
|  1 | qqq   | www   |
|  1 | qqd   | www   |
|  2 | qqq   | www   |
|  2 | qqq   | wwe   |


а для случая:

  <text1>q1q</text1>
  <text1>q2d</text1>
  <text2>w3w</text2>
  <text2>w4e</text2>
и что конкретно не получилось?

anonymous
()
Ответ на: комментарий от anonymous

Вывод получается

| id | text1 | text2 |
|  1 | qqq   | qqd   | www   |
|  2 | qqd   | www   | wwe   |

в случае с одним значением для text1 и text2 - строка тоже 1, с предложенным тобой - 2 База с серверами хранится в xml, нужно импортнуть это в ексель для работы менеджеров. у Серверов 3 параметра - ID, IP, Name IP может быть несколько, как и Name(алиасов)

Zlobin
() автор топика

Не понял причем тут Perl. Может в толксы перенести?

outtaspace ★★★
()

Не получается

А ты пробовал?

XML::Simple

router ★★★★★
()

Должно работать для любого количества text1..textN

#!/usr/bin/perl
use 5.014;
use warnings;
use XML::Twig;

sub generate_line {
    my ($row, $keys) = @_;
    return [] if !@$keys;
    my @remaining = generate_line($row, [ @{$keys}[1..$#{$keys}] ]);
    return map {
        my $current = $_;
        map { [ $current, @$_ ] } @remaining;
    } @{$row->{$keys->[0]}};
}

my $parser = XML::Twig::->new(
    twig_handlers => {
        content => sub {
            my ($t, $content) = @_;
            my $id = $content->att("id");
            my %row;
            push @{$row{$_->tag}}, $_->text for $content->children;
            # use Text::CSV here if you need
            print(join("\t", $id, @$_),"\n") for generate_line(\%row, [ sort keys %row ]);
        }
    },
);

$parser->parse(\*DATA);
__DATA__
<data>
 <content id="1">
  <text1>qqq</text1>
  <text1>qqd</text1>
  <text2>www</text2>
  <text3>a</text3>
  <text3>b</text3>
  <text3>c</text3>
 </content>
 <content id="2">
  <text1>qqq</text1>
  <text2>www</text2>
  <text2>wwe</text2>
  <text3>d</text3>
  <text3>e</text3>
 </content>
</data>
1       qqq     www     a
1       qqq     www     b
1       qqq     www     c
1       qqd     www     a
1       qqd     www     b
1       qqd     www     c
2       qqq     www     d
2       qqq     www     e
2       qqq     wwe     d
2       qqq     wwe     e
AITap ★★★★★
()
Ответ на: комментарий от AITap

Спасибо! Никак не выходил каменный цветок :)

Zlobin
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.