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>

どうすれば xref タグを削除してそのコンテンツを保持できますか?

4

2 に答える 2

3

erase-methodを使用できます。

erase

要素を消去します。要素が削除され、そのすべての子がその場所に貼り付けられます。

sub使用方法は次のとおりです。

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

<i>が閉じられていないため、XML の例は解析されませんでした。

于 2012-11-09T08:56:18.647 に答える
2

keep_encoding => 1ビットがビットの中にあるのはなぜtwig_handlersですか?ドキュメントに間違っているものはありますか?

twig_roots/を使用して、関心のtwig_print_outside_rootsある s 以外のすべてを通過させる、より簡単な方法でこれを行います。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');

オプションは、適切なstwig_rootsに対してのみトリガーされます。xrefこの@ref-type=~/^(?i:bibr)/]ビットは、Perl のように正規表現を使用できるようにする XPath への XML::Twig 拡張を使用します。この(?i:部分により、大文字と小文字が区別されなくなります。これらの要素については、タグではなく、内部の XML を出力します。

オプション (私はそれが長いオプション名であることを知っていtwig_print_outside_rootsます!) により、xref 要素以外のすべてがそのまま出力されるため、属性の順序やインデントを維持することを心配する必要はありません。元の XML。

于 2012-11-09T10:44:38.100 に答える