读取和缩进xml文件perl

时间:2012-08-28 13:52:45

标签: perl

我有以下Perl代码,它会读取输入并正确缩进文件。由于xmllint存在一些问题,我没有使用XML-TidyDTD。但是,让我们说练习我使用下面的代码:

 ### 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 个答案:

答案 0 :(得分:2)

怎么样

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

无需将缩进设置为2个空格,这是默认值。最后的1也是不需要的,只需要模块,通知解析器它们已正确加载。

这也等同于xml_pp -i myfile.xml

答案 1 :(得分:0)

读取和写入整个文件的最简单方法可能是模块File::Slurp。这让它变得如此简单:

use File::Slurp;
my $content = read_file('some_file.xml');
# do stuff
write_file('some_file.xml', $content);

答案 2 :(得分:0)

XML::Simple就是您所需要的。它不关心DTD。它可以读取和写入XML并缩进它。

答案 3 :(得分:0)

有关详细信息,请参阅open

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

# ...

open my $OUT, '>', 'file.xml' or die $!;
print {$OUT} $sXML;
close $OUT;