我有以下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
答案 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>