3

Perl入力を読み取り、ファイルを正しくインデントする次のコードがあります。を使用していないxmllintか、またはXML-Tidyに問題があるためDTDです。しかし、演習のために以下のコードを使用したとしましょう:

 ### begin_: file metadata
        ### <region-file_info>
        ### main:
        ###   - name    : XMLPrettyPrint: simple xml pretty print in perl
        ###     desc    : use perl with XML::Twig library to print indented xml
        ###     date    : created="Thu 2005-12-01 11:08:15"
        ###     last    : lastmod="Thu 2005-12-01 11:22:34"
        ###     lang    : perl
        ###     tags    : perl xml indent formatted pretty string cfPrettyPrint
        ### </region-file_info>

### begin_: init perl
    use strict;
    use warnings;
    use XML::Twig;

### begin_: init vars
    my  $sXML  = join "", (<DATA>);

    ### init params
    my  $params = [qw(none nsgmls nice indented record record_c)];
    my  $sPrettyFormat  = $params->[3] || 'none';

### begin_: process
    my  $twig= new XML::Twig;
    $twig->set_indent(" "x2);
    $twig->parse( $sXML );
    $twig->set_pretty_print( $sPrettyFormat );
    $sXML      = $twig->sprint;

### begin_: output
    print $sXML;

### begin_: sample data
    1;
    __END__
<table><tr age="35" >
<fname>Homer</fname>
<lname>Simpson</lname></tr>
<tr age="33" >
<fname>Barney</fname>
<lname>Rubble</lname></tr>
<tr age="29" >
<fname>Betty</fname>
<lname>Rubble</lname></tr></table>

インデントと印刷は正しく行われます...ただし、XMLファイルから読み取り、インデントしてから、新しい形式で同じファイルに戻す必要がありました。サンプルデータではなくファイルから入力を読み取り、上記のコードを使用してインデントするにPerlはどうすればよいですか? ありがとう

4

4 に答える 4

2

どうですか

my $file= $ARGV[0];
XML::Twig->new( pretty_print => 'indented')
         ->parsefile( $file )
         ->print_to_file( $file);

インデントを 2 つのスペースに設定する必要はありません。これがデフォルトです。最後の 1 も必要ありません。モジュールが適切にロードされたことをパーサーに通知するためにのみ必要です。

これも同等ですxml_pp -i myfile.xml

于 2012-08-28T14:34:22.120 に答える
0

詳細については、開くを参照してください。

open my $XML, '<', $filename or die $!;
my $sXML  = join "", (<$XML>);
close $XML;

# ...

open my $OUT, '>', 'file.xml' or die $!;
print {$OUT} $sXML;
close $OUT;
于 2012-08-28T13:56:39.150 に答える
0

ファイル全体を読み書きする最も簡単な方法は、おそらくモジュールですFile::Slurp。次のように簡単に実行できます。

use File::Slurp;
my $content = read_file('some_file.xml');
# do stuff
write_file('some_file.xml', $content);
于 2012-08-28T13:55:36.540 に答える
0

XML::Simpleが必要です。DTD は気にしません。XML の読み取りと書き込み、およびインデントも可能です。

于 2012-08-28T13:55:58.040 に答える