【问题标题】:How do I edit the contents of an XML file in perl?如何在 perl 中编辑 XML 文件的内容?
【发布时间】: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) 从未给我“真”值,即使我通过打印它们检查了这些值是否相等。可能是因为编码?如果是这样,我该如何解决?我相信有更优雅的方法来实现我正在尝试的东西;我认为这将是解决我的问题的一种快速而肮脏的方法(显然不是)。如有任何建议,我将不胜感激。

【问题讨论】:

    标签: xml perl encoding


    【解决方案1】:

    我也会使用XML::LibXML 来更改值。

    #!/usr/bin/perl
    use warnings;
    use strict;
    
    use XML::LibXML;
    
    my $olddom = 'XML::LibXML'->load_xml(location => 'old.xml');
    my $oldweight = ($olddom->findnodes('//Movie/@Weight'))[0]->value;
    
    my $newdom = 'XML::LibXML'->load_xml(location => 'new.xml');
    my $newweight = ($newdom->findnodes('//Movie/@Weight'))[0];
    $newweight->setValue($oldweight);
    $newdom->toFile('new2.xml');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2017-03-08
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      相关资源
      最近更新 更多