【发布时间】:2020-05-11 20:16:24
【问题描述】:
我是 perl 新手,请原谅我的幼稚。
我有几千个 XML 文件及其对应的旧版本,对于每个文件,我需要从旧 XML 文件中读取一个值(电影 -> 权重)并将其更新为新的 XML 文件,最好保留相同的文件名。
文件,部分看起来像这样。
# Old XML file
<?xml version="1.0" encoding="UTF-16"?>
-<Movie MagnificationCorrection="1, 1, 0" Weight="1" Bfactor="0" MaskPercentage="1.5895931142410015649452269200" MeanFrameMovement="0.8939736" CTFResolutionEstimate="3.1" UnselectManual="null" UnselectFilter="False">
</Movie>
# new XML file
<?xml version="1.0" encoding="UTF-16"?>
-<Movie MagnificationCorrection="1, 1, 0" Weight="3" Bfactor="0" MaskPercentage="1.5895931142410015649452269200" MeanFrameMovement="0.3284904" TFResolutionEstimate="3.1" UnselectManual="null" UnselectFilter="False">
</Movie>
我的方法相当粗糙:我使用 XML::LibXML 解析旧文件并提取旧值,
use warnings;
use XML::LibXML;
my $olddom = XML::LibXML -> load_xml(location => "oldfile.xml");
my $oldWeight = $olddom -> findnodes('//movie/@Weight');
然后尝试在写入模式下打开新的 XML 文件,在读取模式下打开旧文件,以便将旧文件中的每一行复制并打印到新文件中,除非该行恰好有关键字“Weight=”,在在这种情况下,它将编辑该行以包含旧的重量值,然后在新文件中打印该行。
#Apologies for how crude the code looks.
open (my $oldfh,"<oldfile.xml") or die "Not found\n";
open (my $newfh, ">newfile.xml") or die "Error\n";
my $matchstring = ' Weight=';
while (my $row = <$oldfh>){
my $match = 0;
my @row_comp = split(/"/,$row);
foreach my $row_comp(@row_comp){
if ($row_comp eq $matchstring){
my $match = 1;
}
}
if $match == 1{
my $newrow = @row_comp[0];
foreach (1..16){
if $_ == 2{
$newrow = $newrow . "\"" . $oldWeight;
}else{
$newrow = $newrow . "\"". @row_comp[$_]);
}
}
}else{
print $newfh $row;
{
}
}
然而,($row_comp eq $matchstring) 从未给我“真”值,即使我通过打印它们检查了这些值是否相等。可能是因为编码?如果是这样,我该如何解决?我相信有更优雅的方法来实现我正在尝试的东西;我认为这将是解决我的问题的一种快速而肮脏的方法(显然不是)。如有任何建议,我将不胜感激。
【问题讨论】: