如何替换XML属性名称值

时间:2013-04-11 12:52:46

标签: xml perl xml-twig

我有以下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();

但没有变化! 任何想法都非常感激。

此致 Behzad

2 个答案:

答案 0 :(得分:1)

您的代码存在一些问题:

  • 它没有编译:{{1​​}}不是有效的陈述

  • 使用->set_att可以让您知道XMLOUT有问题,如果要输出到文件,可以使用use warnings,使用print() on unopened filehandle XMLOUT }

  • 您的处理程序在print_to_file上,当您要更新的元素被称为parameter时,实际上甚至可以指定您只想更新property属性名称property直接位于处理程序触发器中:name1

  • 看起来你想要的是更改属性的文本,而不是属性

修好所有这些后,你得到了

property[@name="name1"]

答案 1 :(得分: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>