gpt4 book ai didi

XML 替换标签的值并添加标签

转载 作者:数据小太阳 更新时间:2023-10-29 02:30:38 27 4
gpt4 key购买 nike

在更新 XML 方面需要帮助。我浏览了此链接,它非常有帮助。

Perl code for Find and replace a tag value in XML

接下来,我创建了以下代码,但仍需要更多帮助。我要替换的标记值是“numCoreThreads”。

当我给标签值时,它会替换该值并且工作正常。

  • 我希望代码替换给定的任何值值(value)。
  • 此外,如何在父标签下添加新标签。 Exp 添加标签 -

    <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;
}

最佳答案

我会在 twig_handlers 中完成所有工作:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new(
twig_handlers => {
'numCoreThreads' => sub { $_->set_text( '5000' ) },
'ftOptimizeThreshold' => sub {
my $e = XML::Twig::Elt->new( 'OptimizeThreshold' => '250' );
$e->move( after => $_ );
},
},
pretty_print => 'indented',
)->parsefile( shift )->print;

像这样运行它:

perl script.pl xmlfile

它产生:

<svr_config>
<port>34343</port>
<PortMapper>false</PortMapper>
<numCoreThreads>5000</numCoreThreads>
<plugins>
<plugin>
<userDefined>
<ftOptimizeThreshold>1000</ftOptimizeThreshold>
<OptimizeThreshold>250</OptimizeThreshold>
</userDefined>
</plugin>
</plugins>
</svr_config>

更新:查看评论。

使用参数读取文件的每一行,用冒号分隔并将字段保存在适合您需要的数据结构中。然后简单地将文字替换为这些值的内容。

die qq|Usage: perl $0 <arg-file> <xml-file>\n| unless @ARGV == 2;

open my $fh, '<', shift or die;
while ( <$fh> ) {
chomp;
my @f = split /\s*:\s*/;
## Save fields in a data structure.
}

关于XML 替换标签的值并添加标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19840002/

27 4 0