我只需要在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>
如何删除外部参照标记并保留其内容?
答案 0 :(得分:3)
您可以使用erase
-method:
erase
删除元素:删除元素并将其所有子元素粘贴到其位置。
这是sub
使用它:
sub xref {
my ( $twig, $xref ) = @_;
$xref->erase;
}
请注意,对我来说,您的示例XML未解析,因为<i>
未关闭。
答案 1 :(得分: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)/]
位使用XML :: Twig扩展到XPath,允许你使用像Perl一样的正则表达式,(?i:
部分使它不区分大小写。对于这些元素,打印内部XML,而不是标记。
twig_print_outside_roots
选项(我知道它是一个looong选项名称!)导致除了外部参照元素之外的所有内容都按原样输出,因此您不必担心保留属性顺序或缩进,它将与原始XML中的相同。