5

XML::Twigは初めてです。<foo/>開始タグと終了タグの組み合わせ ( ) ではなく、空の要素タグ ( ) を使用するようにすべての空の要素を変更するにはどうすればよい<foo></foo>ですか?

入力:

<book>
    <given-names>Maurice<xref ref-type="fn" rid="fnI_1"></xref></given-names>
    <colspec colname="col1" colnum="1"></colspec>
    <entry align="left"><p></p></entry>
</book>

次のような出力が必要です。

<book>
    <given-names>Maurice<xref ref-type="fn" rid="fnI_1"/></given-names>
    <colspec colname="col1" colnum="1"/>
    <entry align="left"><p/></entry>
</book>

私は試した:

       use XML::Twig;
       my $xml = XML::Twig->new(twig_handlers => {
                                  'xref' => sub {$_->set_tag('#EMPTY'),},
                                },
                                pretty_print => 'indented',                                        
                               );
       $xml->parse('sample.xml');
       $xml->print;
}

しかし、私はそれを処理することはできません。コンテンツタグなしでグローバルに空のタグに変更するにはどうすればよいですか? どうすれば変更できますか?

4

2 に答える 2

5

XML::LibXML は自動的に短いバージョンを出力します。

use XML::LibXML qw( );
print XML::LibXML->new()->parse_file($ARGV[0])->toString();

XML::Twig に関しては、デフォルトで短い形式 ( empty_tags => 'normal') も使用します。ただし、から作成された空の要素のみを考慮し<foo/>ます。(私にはかなりばかげているようです!) 掘り下げてみたところ、要素が空であるかどうかを考慮して変更できることがわかりました。これは、 と を使用して行われset_emptyますset_not_empty

use XML::Twig qw( );
my $twig = XML::Twig->new(
   twig_handlers => {
      '*' => sub {
         $_->set_empty() if !$_->first_child();
      },
   },
);
$twig->parsefile($ARGV[0]);
$twig->print();
于 2013-01-17T09:41:25.643 に答える
2

Twig を使い続けたい場合は、次のようにします。

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

my $xml = XML::Twig->new(twig_handlers => {
             'p' => sub { 
                 if (!$_->first_child()) { $_->set_content('#EMPTY') } 
              },
           },
           pretty_print => 'indented',
           empty_tags => 'normal'                                 
);

$xml->parsefile('file.xml');
$xml->print;

基本的に、要素に何も含まれていないかどうかを手動で確認してから、空の要素に設定する必要があります。

于 2013-01-17T09:55:42.750 に答える