2013-03-09 29 views
1

我敢肯定,我沒有正確地使用它,我的代碼:XML小枝總是編輯XML

#!/usr/bin/env perl 
use strict; 
use warnings; 
use XML::Twig; 

XML::Twig->new(pretty_print => 'indented', 
       twig_handlers => { '//Item[@PartNumber]' => \&_pitem 
            }, 
)->parsefile_inplace('order2.xml', '.bak'); 

sub _pitem { 
    $_->set_text(...) if (....); 
} 

如果沒有匹配的XML中XPath表達式的元素,似乎是XML證明爲空...它截斷文件。 我希望的行爲是: 避免編輯XML,如果沒有元素匹配。

回答

4

如果使用parsefile_inplace那麼該文件將在任何情況下被覆蓋。

您需要輸入flush該文件,或者在必要時自行管理新文件的創建。

您可以使用XML::Twig中的代碼作爲基礎。

0

在_pitem結束,你必須

$_->flush; 
1

你什麼也沒有寫輸出任何XML。

你應該使用twig_roots這樣

my $twig = XML::Twig->new(
    twig_roots    => { '//Item[@PartNumber]' => \&_pitem }, 
    twig_print_outside_roots => 1, 
    pretty_print    => 'indented', 
); 

$twig->parsefile_inplace('order2.xml', '.bak'); 

sub _pitem { 
    $_->set_text(...) if (....); 
    $_->print; 
}