我在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>
感谢您的帮助。
答案 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';