2015-04-22 3 views
1

Я использую Perl и XML::Twig. Я внес некоторые изменения в файл XML (изменение значений тегов). Но я не могу записать его в том же файле XML. Если я использую parsefile_inplace(), весь XML-файл становится пустым. Пожалуйста, найдите код ниже.Как я могу изменить XML-файл на месте с помощью Perl XML :: Twig?

use strict; 
use warnings; 
use XML::Twig; 

my $twig= XML::Twig->new(
     pretty_print => 'indented', 
     twig_handlers => { 
      jdk => sub{ 
      $_->set_text('JDK 1.8.0_40') 
      }, 
      }, 
     ); 
$twig->parsefile_inplace('nightly.xml', 'bak.*'); 
$twig->flush; 

Часть файла XML:

<jdk>JDK 1.7.0_40</jdk> 

Если я использую флеш команду дает желаемый результат на ЦМД.

Если я использую команду parsefile_inplace, она опорожняет nightly.xml.

Если я просто использую parsefile, исходный файл будет сохранен без изменения значения, которое я хочу изменить.

Мое требование, чтобы изменить значение и сохранить его в том же файле

ответ

4

Вот что the documentation for parsefile_inplace говорит:

parsefile_inplace ($file, $optional_extension)

синтаксический анализ и обновление файла «на месте». Он делает это, создавая временный файл, , выбрав его по умолчанию для операторов print() (и методов), а затем разбор входного файла. Если синтаксический анализ завершен успешно, то временный файл перемещается для замены входного файла.

Если добавлено расширение, исходный файл резервную копию (правила для расширения такие же, как правило для опции -i в perl). (курсив мой)

Я не вижу каких-либо заявлений для печати в вашем коде.

Вот один из способов сделать это, с небольшими изменениями в вашем коде:

#!/usr/bin/env perl 

use strict; 
use warnings; 

use XML::Twig; 

my $twig= XML::Twig->new(
    pretty_print => 'indented', 
    twig_roots => { 
     jdk => sub{ 
      my ($t, $jdk) = @_; 
      $jdk->set_text('JDK 1.8.0_40'); 
      $jdk->print; 
      $jdk->purge; 
      return; 
     }, 
    }, 
    twig_print_outside_roots => 1, 
); 

$twig->parsefile_inplace('nightly.xml', '.bak'); 
$twig->flush; 
+0

Ах да, я не использовал оператор печати. Это сработало. Спасибо @Sinan Unur – sai

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