3

XML の更新に助けが必要です。私はこのリンクを通過しましたが、非常に役に立ちました。

XML のタグ値を検索して置換するための Perl コード

引き続き、以下のコードを作成しましたが、さらにヘルプが必要です。置き換えたいタグ値は「numCoreThreads」です。

タグ値を指定すると、値が置き換えられ、正常に機能します。

  • 指定された値に存在する値をコードで置き換えたいと思います。
  • また、親タグの下に新しいタグを追加するにはどうすればよいですか。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;
}
4

1 に答える 1

3

私は内部ですべての作業を行います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.
}
于 2013-11-07T15:57:37.973 に答える