2

次の XML があります。

<resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <resource id="kig" type="com.ac.resourcedata.xml" site="ki">
    <property name="name1">value1</property>
    <property name="name2">value2</property>
  </resource>
</resources>

value1 を別のものに変更する必要があり、これまでに作成できたのは次の Perl スクリプトです。

use strict;
use XML::Twig;

my $file = $ARGV[0];
my $twig=XML::Twig->new(   
    twig_handlers => { 
        parameter  => sub {
            if ($_->att('name') eq 'name1') {
                ->set_att(new value) 
            }
        }
    },
    pretty_print => 'indented',
);

$twig->parsefile($file);

$twig->print(\*XMLOUT) or
die "Failed to write modified XML file:$!\n";

close XMLOUT;

$twig->flush();

でも何も変わらない!どんなアイデアでも大歓迎です。

よろしく、ベザド

4

2 に答える 2

1

XML::Twig要素のハンドラーを設定しましたparameterが、データにないため、何も変更されません。

加えて

  • use strict良いですが、あなたもすべきですuse warnings

  • XMLOUTハンドルでファイルを開くことはありません。print_to_file自分でファイルを開く必要がないようにするには、モジュールのメソッドを使用する方が簡単です

あなたがやりたいと思うnameことは、要素の属性を探してproperty、それらが現在 と等しい場合は別のものに設定することですname

このコードはそれを行います。

use strict;
use warnings;

use XML::Twig;

my ($file) = @ARGV;

my $twig = XML::Twig->new(   
    twig_handlers => { 
        property => sub {
            if ($_->att('name') eq 'name1') {
                $_->set_att(name => 'something else');
            }
        }
    },
    pretty_print => 'indented',
);

$twig->parsefile($file);

$twig->print_to_file('xmlout.xml');

出力

<resources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <resource id="kig" site="ki" type="com.ac.resourcedata.xml">
    <property name="something else">value1</property>
    <property name="name2">value2</property>
  </resource>
</resources>
于 2013-04-11T13:19:09.847 に答える
1

コードにはいくつかの問題があります。

  • コンパイルされません:->set_att有効なステートメントではありません

  • を使用use warningsすると、XMLOUT に何か問題があることがわかりprint() on unopened filehandle XMLOUTます。ファイルに出力する場合は、次のようになります。print_to_file

  • parameter更新する要素が呼び出されたときにハンドラーが onでpropertyあり、実際にはproperty、属性名がname1ハンドラートリガーに直接ある場合にのみ更新するように指定することもできます。property[@name="name1"]

  • 属性ではなく、プロパティのテキストを変更したいようです

これをすべて修正すると、

#!/usr/bin/perl

use strict;
use warnings;

use autodie qw( open);

use XML::Twig;

my $file = $ARGV[0];
my $twig=XML::Twig->new(   
    twig_handlers => { 
        'property[@name="name1"]'  => sub { $_->set_text('value') }
    },
    pretty_print => 'indented',
);

$twig->parsefile($file);
$twig->print_to_file( $file);
于 2013-04-11T13:07:44.447 に答える