2012-11-09 34 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