0

我有以下格式的 XML 文件:

<Principal ID="122" >
<Status Fees="${Fees}"/>
</Principal>
<Principal ID="123" >
<Status Fees="${Fees}"/>
</Principal>
<Principal ID="124" >
<Status Fees="${Fees}"/>
</Principal>
<Principal ID="125" >
<Status Fees="${Fees}"/>
</Principal>

我需要${Fees}用 Fees1、Fees2、Fees3 等更新变量。有超过 365 条记录。有人可以帮助我如何通过 Perl 或 Python 做到这一点吗?

4

2 回答 2

0

使用正则表达式进行 xml 操作并不是一个好主意,但在这种情况下,我还是会使用它:

Perl 脚本:

my $xml = join (/\n/, <main::DATA>);
my @fees = (1, 2, 3, 4);

$xml =~ s/(<Status Fees=")\${Fees}("\/>)/{$1 . shift(@fees) . $2}/ige;

print "$xml";

__DATA__
<Principal ID="122" > 
<Status Fees="${Fees}"/> 
</Principal> 
<Principal ID="123" > 
<Status Fees="${Fees}"/> 
</Principal> 
<Principal ID="124" > 
<Status Fees="${Fees}"/> 
</Principal> 
<Principal ID="125" > 
<Status Fees="${Fees}"/> 
</Principal>

输出:

<Principal ID="122" > 
<Status Fees="1"/> 
</Principal> 
<Principal ID="123" > 
<Status Fees="2"/> 
</Principal> 
<Principal ID="124" > 
<Status Fees="3"/> 
</Principal> 
<Principal ID="125" > 
<Status Fees="4"/> 
</Principal>

在这里查看并测试它。


如果要替换${Fees}为变量的实际值$Fees并且此变量的名称发生更改,请使用:

Perl 脚本:

my $xml = join (/\n/, <main::DATA>);
my ($fee1, $fee2, $fee3, $fee4) = (1, 2, 3, 4);

$xml =~ s/(<Status Fees=")\${(.*?)}("\/>)/{$1 . eval('$'.$2) . $3}/ige;

print "$xml";

__DATA__
<Principal ID="122" > 
<Status Fees="${fee1}"/> 
</Principal> 
<Principal ID="123" > 
<Status Fees="${fee2}"/> 
</Principal> 
<Principal ID="124" > 
<Status Fees="${fee3}"/> 
</Principal> 
<Principal ID="125" > 
<Status Fees="${fee4}"/> 
</Principal>

输出:

<Principal ID="122" > 
<Status Fees="1"/> 
</Principal> 
<Principal ID="123" > 
<Status Fees="2"/> 
</Principal> 
<Principal ID="124" > 
<Status Fees="3"/> 
</Principal> 
<Principal ID="125" > 
<Status Fees="4"/> 
</Principal>

在这里查看并测试它。

于 2012-06-22T12:08:16.393 回答
0

简短的 Python 版本。相当低效,但即时运行超过 365 个条目。

xml = open("INPUT.XML","rb").read()
count = 1
while "${Fees}" in xml:
    xml = xml.replace("${Fees}", "Fees%d"%count, 1)
    count += 1
open("OUTPUT.XML","wb").write(xml)
于 2012-06-22T12:30:02.683 回答