2013-07-29 4 views
2

Я пытаюсь добавить атрибут в существующий XML, используя XML :: Simple.
Добавить атрибут в xml с XML :: Simple

<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 тега.
До сих пор у меня есть следующие:

#!/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 хэш, в котором я должен вставить в каждом ключе Branche атрибут ключа и значения типа.
Кроме того, я не знаю, где и как ($ arbres {something} = "conifere"?).
Благодаря

+3

XML :: Simple обычно далеко от простой в использовании, и собственный документация говорит * "Использование этого модуля в новом коде рекомендуется использовать другие модули, которые обеспечивают более простые и последовательные интерфейсы. В частности, настоятельно рекомендуется использовать XML :: LibXML. Основными проблемами с этим модулем являются большое количество опций и произвольные способы взаимодействия этих параметров - часто с неожиданные результаты ». * – Borodin

+0

[Почему is XML :: Simple "disuraged"] (http://stackoverflow.com/questions/33267765/why-is-xmlsimple-discouraged) – Sobrique

ответ

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) 
2

Использование XML::XSH2, оберткой XML::LibXML

open test.xml ; 
for //branche[@name='courbe'] set @type 'conifere' ; 
for //branche[@name='droite'] set @type 'resineux' ; 
save :b ; 
+0

Это круто! К сожалению, XML :: Simple - это ограничение. – Samuel

Смежные вопросы