Perl 脚本,用于根据单独文本文件中的值查找和替换 XML 中的属性

问题描述 投票:0回答:1

我拼凑了一个 Perl 脚本,将特定标签的特定属性替换为我需要的内容。脚本如下...

#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
use utf8;
use open ':encoding(UTF-8)', ':std';

#ingest data
my $twig = XML::Twig -> new ->parsefile('test.xml');

#iterate all tags <host>
foreach my $host_id  ( $twig -> get_xpath('//host') ) {
   #check testname regex match
   if ( $host_id -> att('id') == AAAA ) {
       $host_id -> set_att('id', '1111');
   }
}

#iterate all tags <guest>
foreach my $guest_host  ( $twig -> get_xpath('//guest') ) {
   #check testname regex match
   if ( $guest_host -> att('host') == AAAA ) {
       $guest_host -> set_att('host', '1111');
   }
}

open ( my $output, ">", "new.xml" ) or die $!;
$twig -> set_pretty_print('indented');
$twig -> print ( $output );

我现在的问题是,我需要更改大约 100 个“主机”,为了便于编辑,我想编写一个单独的文本文件,其中记录了我要更改的“主机”以及我要更改的内容想要将它们更改为。像这样的东西...

hosts

    AAAA => 1111
    BBBB => 2222
    CCCC => 3333

如何修改脚本以引用单独的文本文件并检查每个属性,然后相应地替换它们?

我真的不知道从哪里开始。当我用谷歌搜索时,我找不到任何我能理解的东西,看起来这就是我需要的。

regex xml perl xml-twig
1个回答
0
投票

只需从文件创建一个查找表。

my %host_mappings = (
   "AAAA" => "1111",
   "BBBB" => "2222",
   "CCCC" => "3333",
);

那么就只剩下查找更新值的问题了。

my $new_host = $host_mappings{ $old_host } // $old_host;
© www.soinside.com 2019 - 2024. All rights reserved.