更新XML文件中的值

时间:2012-06-22 11:04:33

标签: python xml perl

我正在使用以下格式的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>

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

2 个答案:

答案 0 :(得分: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>

查看并测试here


如果您想将${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>

查看并测试here

答案 1 :(得分: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)