在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)模式将为你省去一点痛苦。”