在perl中读取和缩进xml文件
我有以下在perl中读取和缩进xml文件,perl,Perl,我有以下Perl代码,可以正确读取输入并缩进文件。我没有使用xmllint或xmlty,因为DTD存在一些问题。但假设我使用下面的代码进行练习: ### begin_: file metadata ### <region-file_info> ### main: ### - name : XMLPrettyPrint: simple xml pretty print in perl ### desc
Perl
代码,可以正确读取输入并缩进文件。我没有使用xmllint
或xmlty
,因为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>
###开始#:文件元数据
###
###主要内容:
###-name:XMLPrettyPrint:simple xml perl格式的漂亮打印
###desc:使用perl和XML::Twig库打印缩进的XML
###日期:created=“Thu 2005-12-01 11:08:15”
###last:lastmod=“Thu 2005-12-01 11:22:34”
###朗:perl
###标记:perl xml缩进格式的漂亮字符串cfPrettyPrint
###
###开始:初始化perl
严格使用;
使用警告;
使用XML::Twig;
###开始:初始化变量
我的$sXML=加入“”();
###初始化参数
my$params=[qw(无nsgmls良好缩进记录_c)];
my$sPrettyFormat=$params->[3]| |“无”;
###开始:进程
my$twig=新XML::twig;
$twig->set_缩进(““x2”);
$twig->parse($sXML);
$twig->set\u pretty\u print($sPrettyFormat);
$sXML=$twig->sprint;
###开始:输出
打印$sXML;
###开始:示例数据
1.
__结束__
荷马
辛普森
巴尼
瓦砾
贝蒂
瓦砾
它缩进并且打印正确。。。但是,我需要从XML
文件中读取它,缩进,然后用新格式将它右键返回到同一个文件。我完全不熟悉Perl
,如何从文件中读取输入而不是样本数据,然后使用上面的代码进行缩进?
谢谢读取和写入整个文件的最简单方法可能是模块
File::Slurp
。这样做很容易:
use File::Slurp;
my $content = read_file('some_file.xml');
# do stuff
write_file('some_file.xml', $content);
这就是你需要的。它不关心DTD。它可以读取和写入XML,也可以缩进XML。有关详细信息,请参阅:
open my $XML, '<', $filename or die $!;
my $sXML = join "", (<$XML>);
close $XML;
# ...
open my $OUT, '>', 'file.xml' or die $!;
print {$OUT} $sXML;
close $OUT;
打开我的$XML、'file.XML'或die$!;
打印{$OUT}$sXML;
收尾美元;
怎么样
my $file= $ARGV[0];
XML::Twig->new( pretty_print => 'indented')
->parsefile( $file )
->print_to_file( $file);
无需将缩进设置为2个空格,这是默认值。最后的1也不是必需的,只是模块需要它来通知解析器它们已正确加载
这也相当于
xml\u pp-i myfile.xml
对于那些从未来来到这里的人来说,文档现在说“你真的不想在新代码中使用这个模块。如果你忽略这个警告,不管怎样使用它,qw(:strict)模式将为你省去一点痛苦。”