Не используйте XML::Simple
.
XML::LibXML
и XML::Twig
- гораздо лучшие альтернативы.
Вот решение с использованием XML :: Twig:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $xml = XML::Twig -> new -> parsefile ( 'test1.xml' );
$_ -> set_text('10') for $xml -> get_xpath('//message/attributes/value[@key="4"]');
$xml -> set_pretty_print('indented');
$xml -> print;
Это дает вам:
<body>
<message>
<name>gandalf</name>
<attributes>
<value key="1">1</value>
<value key="2">2</value>
<value key="3">3</value>
<value key="4">10</value>
</attributes>
</message>
</body>
Вы можете печатать в файл, открыв дескриптор файла и указав для этого fh какаргумент print
:
open ( my $ouput, '>', 'test2.xml' ) or die $!;
$xml -> print ( $output );
Поскольку вы также спрашиваете в комментариях:
Я также хочу знать, как установить текст для значения с ключом, который не существует,Например, я хочу добавить <value key="5">5</value>
внутри атрибутов
my $attributes = $xml -> get_xpath('//message/attributes',0); #0 to find the first one.
$attributes -> insert_new_elt('last_child', 'value', { key => 5 }, 5 );
или одной строкой:
$xml -> get_xpath('//message/attributes',0) -> insert_new_elt('last_child', 'value', { key => 5 }, 5 );
Обратите внимание на немного другое использование get_xpath
- мы даемвторой аргумент 0
- потому что он говорит «получите первый соответствующий элемент», а не каждый соответствующий элемент.