2

XML::Simple を使用して、既存の XML に属性を追加しようとしています。

<arbre>
  <branche name="courbe" >
    <description>
      <![CDATA[une belle branche]]>
    </description>
    <feuilles>
      <fleur color="blue" order="1" />
      <fleur color="white" order="2" />
      <fleur color="yellow" order="3" />
    </feuilles>
  </branche>
  <branche name="droite" >
    <description>
      <![CDATA[une branche commune]]>
    </description>
    <feuilles>
      <fleur color="purple" order="1" />
      <fleur color="green" order="2" />
    </feuilles>
  </branche>
</arbre>

私が変換しようとしているのは:

<arbre>
  <branche name="courbe" type="conifere">
    <description>
      <![CDATA[une belle branche]]>
    </description>
    <feuilles>
      <fleur color="blue" order="1" />
      <fleur color="white" order="2" />
      <fleur color="yellow" order="3" />
    </feuilles>
  </branche>
  <branche name="droite" type="resineux">
    <description>
      <![CDATA[une branche commune]]>
    </description>
    <feuilles>
      <fleur color="purple" order="1" />
      <fleur color="green" order="2" />
    </feuilles>
  </branche>
</arbre>

branche タグの type 属性に注目してください。
これまでのところ、次のものがあります。

#!/usr/bin/env perl -w

use strict;
use XML::Simple;
use Data::Dumper;

my $funclist = XML::Simple->new();
my $arbres   = $funclist->XMLin("test.xml");

print Dumper($arbres);
exit 0;

ドキュメント $arbres から私が理解したことから、各分岐キーに型属性キーと値を挿入する必要があるハッシュです。
どこでどのように手がかりがないことを除いて ($arbres{something} = "conifere" ?)。
ありがとう

4

2 に答える 2

3
use strict;
use warnings FATAL => 'all';
use XML::Simple qw();

my %branche_map = (
    courbe => 'conifere',
    droite => 'resineux',
);
my $xs = XML::Simple->new(StrictMode => 1, ForceArray => 1, KeyAttr => undef, RootName => 'arbre');
my $arbres = $xs->XMLin('test.xml');

for my $branche (@{ $arbres->{branche} }) {
    $branche->{type} = $branche_map{ $branche->{name} };
}
print $xs->XMLout($arbres)
于 2013-07-29T13:56:00.507 に答える
2

XML::LibXMLのラッパーであるXML ::XSH2を使用する

open test.xml ;
for //branche[@name='courbe'] set @type 'conifere' ;
for //branche[@name='droite'] set @type 'resineux' ;
save :b ;
于 2013-07-29T13:52:22.807 に答える