需要帮助更新XML文件。我查阅了这个链接,它对我很有帮助。
接着,我创建了下面的代码,但仍需要更多帮助。我想要替换的标签值是“numCoreThreads”。
当我提供一个标签值时,它替换了那个值,并且运行得很好。
- I would want the code to replace any value that is present to given value.
Also, How can I add a new tag under a parent tag. Exp Add Tag -
<OptimizeThreshold>250</OptimizeThreshold> under <ftOptimizeThreshold>1000</ftOptimizeThreshold>
我的 XML -->
<svr_config>
<port>34343</port>
<PortMapper>false</PortMapper>
<numCoreThreads>12</numCoreThreads>
<plugins>
<plugin>
<userDefined>
<ftOptimizeThreshold>1000</ftOptimizeThreshold>
</userDefined>
</plugin>
</plugins>
当前代码 -->
#!C:\strawberry\perl
use strict;
use warnings;
use XML::Twig;
XML::Twig->new( twig_roots => { numCoreThreads => sub { $_->flush }, },
twig_handlers => { 'numCoreThreads[string()="12"]' => sub { $_->set_text( '5000'); } },
twig_print_outside_roots => 1,
)
->parsefile_inplace( 'config.xml');
尝试使代码更加动态,比如读取输入文件,然后根据从输入文件中读取的参数更新xml。我知道……运行循环会再次打印整个文件……我们能优化它吗?
我的输入文件如下:
numCoreThreads: 20
OptimizeThreshold: ftOptimizeThreshold: 250
我制作的代码看起来像这样:
#!C:\strawberry\perl
use strict;
use warnings;
use XML::Twig;
open(IN1,"INPUT_FTS_XML_PRIMARY.txt");
while(my $r=<IN1>)
{
$r=~/(.*:)\s(.*)/;
my $c1=$1;
my $d1=$2;
my $f1=$3
my $twig = XML::Twig->new(
twig_handlers => {
'$c1' => sub { $_->set_text( 'd1' ) },
if (defined $f1)
{
'$d1' => sub {
my $e = XML::Twig::Elt->new( '$c1' => '$f1' );
$e->move( after => $_ );
},}
},
pretty_print => 'indented',
)->parsefile( shift )->print;
}
[string()="12"]
。我加上它是因为它在你的原始代码中,但我已经编辑了答案以将其删除。 - Bireipod
文档:perldoc XML::Twig
- Bireixml
问题无关。它取决于你使用的数据结构以及如何保存你的数据。如果你使用哈希表,numCoreThreads
作为键,20
作为值,则将字面量5000
替换为hash['numCoreThreads']
。如果你使用数组并将值保存在第一个位置,则使用array[0]
替换字面量。请查看perldsc
文档页面。 - Birei