如何使用XML :: Writer在XML文件的顶部写入

时间:2016-10-18 09:02:18

标签: xml perl

我在Perl中创建了一个带有XML::Writer的XML文件,我希望每次调用我的脚本时它都会在旧文件的开头写入新的XML文件。我知道如何在文件的开头写一行,但是使用XML :: Writer我找不到怎么做。

my $output = new IO::File(">>tmp.xml");
my $writer = new XML::Writer( 
OUTPUT      => $output,
DATA_INDENT => 3,             # indentation, trois espaces
DATA_MODE   => 1,             # changement ligne.
);

这是我编写xml文件的脚本的开头。 修改: 我实际上做了一个看起来像这样的changelog.xml:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="changelog.xsl" type="text/xsl"?>

<root text="MultiDiag">
<version number="V: 7.07.10.0" date="Release date (Fri Oct  7 14:44:52 2016)">
Things
</version>
</root>

我想要的是,每天,新的更改日志都写在旧版本的顶部:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="changelog.xsl" type="text/xsl"?>
<root text="MultiDiag">
<version number="V: 7.07.10.0" date="Release date (The new one)">
Things
</version>
<version number="V: 7.07.10.0" date="Release date (The old one)">
Things
</version>
</root>  

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

诀窍是不要让XML :: Writer直接写入文件。相反,您可以将OUTPUT设置为"self",然后使用$writer->to_string method获取包含渲染输出的字符串。

之后,您需要做的就是关注如何写入文件开头的this example from perlfaq5。您基本上逐行读取现有文件,并将其打印回新文件。如果您在第1行($.是当前读取的行号),则从$writer打印XML。然后,您将临时新文件移动/重命名为旧文件。

use strict;
use warnings;
use IO::File;
use XML::Writer;

my $writer = XML::Writer->new( 
    OUTPUT      => 'self',
    DATA_INDENT => 3,             # indentation, trois espaces
    DATA_MODE   => 1,             # changement ligne.
);

# ... put in your data

# open the old file and a temporary new file
open my $in,  '<',  'tmp.xml'  or die "Can't read old file: $!";
open my $out, '>', 'tmp.xml.new' or die "Can't write new file: $!";

# read from the old file
while( <$in> ) {
    # write the XML into the first line
    print $out $writer->to_string if $. == 1;

    # write the rest of the file line by line
    print $out $_;
}
close $in; 
close $out;

# replace the old file with the new file
rename 'tmp.xml.new', 'tmp.xml';