2016-10-18 4 views
0

Я создаю XML-файл с XML::Writer в Perl, и я бы хотел, чтобы каждый раз, когда я вызываю свой скрипт, он пишет новый XML-файл в начале старый файл. Я знаю, как писать строку в начале файла, но с XML :: Writer я не могу найти, как это сделать.Как написать в верхней части 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. Edit: я на самом деле сделать changelog.xml Wich выглядит следующим образом:

<?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

Добро пожаловать в Переполнение стека и тег Perl. Можете ли вы привести пример того, как вы хотите, чтобы ваш результат был таким? Вы можете отредактировать свой вопрос. Обычно в одном файле есть одна структура данных XML. Во всем есть элемент. Непонятно, что вы имеете в виду, написав сверху. – simbabque

+2

Это почти по определению неверный XML, потому что у вас не будет правильных корневых тегов. – Sobrique

+0

Пожалуйста, не используйте косвенные обозначения объекта. В какой-то момент вы будете путешествовать по ошибке, которую она вызывает, и будут тратить часы, пытаясь ее найти. Вместо 'new IO :: File (..)' и 'new XML :: Writer (...)', вы должны использовать 'IO :: File-> new (...)' и 'XML :: Writer -> новый (...) '. –

ответ

2

Хитрость заключается в том, чтобы не допускать запись XML :: Writer в файл напрямую. Вместо этого вы можете установить OUTPUT в "self", а затем использовать $writer->to_string method, чтобы получить строку с отображаемым выходом.

После этого все, что вам нужно сделать, это следовать за this example from perlfaq5 о том, как записать в начало файла. Вы в основном читаете в своем существующем файле по очереди и распечатываете его обратно в новый файл. Если вы находитесь в строке 1 ($. - текущий номер строки, который читается), вы печатаете XML от $writer. Затем вы перемещаете/переименовываете свой временный новый файл поверх старого.

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'; 
+0

Thx simbabque работает отлично. «OUTPUT =>« self »- это то, что мне нужно. – Gajiu

Смежные вопросы