2012-11-09 62 views
2

我只需要在xml文件中刪除一些標籤。我如何才能刪除標籤

XML:

<p>Originally published <xref ref-type="bibr" rid="ref155">Klein, F. (1978)</xref> <i>Priam Books. Reproduced by permission of the author.</p> 

腳本:

use XML::Twig; 
my $xml_twig_content = XML::Twig->new(
keep_encoding => 1, 
twig_handlers => { 
keep_atts_order => 1, 
'xref' => \&xref, 
}, 
pretty_print => 'indented', 
); 
$xml_twig_content->parsefile('sample.xml'); 

sub xref { 
my ($xml_twig_content, $xref) = @_; 
my $XrefName = $xref->att('ref-type'); 
if ($XrefName =~ /^bibr$/si){ 
$xref->delete; 
} 
} 

我得到的輸出:

<p>Originally published <i>Priam Books. Reproduced by permission of the author.</p> 

我需要輸出:

<p>Originally published Klein, F. (1978) <i>Priam Books. Reproduced by permission of the author.</p> 

如何刪除外部參照標記並保留其內容?

回答

3

可以使用erase-method

erase

刪除元素:元素被刪除,所有的孩子都在其位置粘貼。

這是你的sub使用它:

sub xref { 
    my ($twig, $xref) = @_; 
    $xref->erase; 
} 

注意,對於我來說,你的示例XML沒有解析,因爲<i>沒有關閉。

2

爲什麼keep_encoding => 1位在twig_handlers位內?文檔中是否有錯誤?

我會做這樣的一個簡單的方法,使用twig_roots/twig_print_outside_roots通過但xref是你有興趣的一切:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

XML::Twig->new(keep_encoding => 1, 
       twig_roots => { 'xref[@ref-type=~/^(?i:bibr)/]' => sub { print $_->inner_xml; } }, 
       twig_print_outside_roots => 1, 
      ) 
     ->parsefile('sample.xml'); 

twig_roots選項只觸發正確的xref秒。 @ref-type=~/^(?i:bibr)/]位使用XPath的XML :: Twig擴展,使您可以像使用Perl一樣使用regexps,(?i:部分使其不區分大小寫。對於這些元素,打印內部XML,而不是標籤。

twig_print_outside_roots選項(我知道這是一個looong選項名!)會導致一切,但外部參照元素是原樣輸出的,所以您不必擔心保留屬性順序或縮進,它將是與原始XML相同。

+0

謝謝一切順利.. – user1811486