我有这个xml文件test1.xml
:
<body>
<message>
<name>gandalf</name>
<attributes>
<value key="1">1</value>
<value key="2">2</value>
<value key="3">3</value>
<value key="4">4</value>
</attributes>
</message>
</body>
我想覆盖其键"4"
到"10"
的值
所以我的xml看起来像这样:
<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>
这是我的代码:
#!/usr/bin/perl
use XML::Simple;
my $xml = new XML::Simple;
my $data = XMLin("test1.xml", ForceArray => 1);
$data->{message}->[0]->{attributes}->[0]->{value}->{4}->{content} = "10";
$newData = $xml->XMLout($data);
open(XML,">test2.xml");
print XML $newData;
close(XML);
当我运行此代码时,输出xml如下所示:
<opt>
<message>
<name>gandalf</name>
<attributes name="value">
<1>1<1>
<2>2<2>
<3>3<3>
<4>10<4>
</attributes>
</message>
</opt>
答案 0 :(得分:5)
请勿使用XML::Simple
。
XML::LibXML
和XML::Twig
是更好的选择。
以下是使用XML :: Twig的解决方案:
\1_\3
这会给你:
#!/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;
您可以通过打开文件句柄并将该fh作为参数提供给<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>
来打印到文件:
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
- 因为它说“获得匹配的第一个元素”,而不是匹配的每个元素。