我有以下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
完全不熟悉,如何从文件中读取输入而不是示例数据,然后使用上面的代码缩进?
感谢
答案 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;