在perl中的xml文件中进行更改

时间:2018-05-22 12:07:54

标签: perl

我有这个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>

1 个答案:

答案 0 :(得分:5)

请勿使用XML::Simple

XML::LibXMLXML::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 - 因为它说“获得匹配的第一个元素”,而不是匹配的每个元素。