【问题标题】:reading and indenting a xml file perlperl 读取和缩进 xml 文件
【发布时间】:2012-08-23 01:12:56
【问题描述】:

我有以下Perl 代码,它读取输入并正确缩进文件。由于DTD 的一些问题,我没有使用xmllintXML-Tidy。但是假设我在练习中使用了下面的代码:

 ### 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 完全陌生,我怎么能从文件中读取输入,而不是示例数据,然后使用上面的代码缩进? 谢谢

【问题讨论】:

    标签: perl


    【解决方案1】:

    怎么样

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

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

    这也等价于xml_pp -i myfile.xml

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        XML::Simple 是您所需要的。它不关心DTD。它可以读写你的 XML,也可以缩进它。

        【讨论】:

        • 对于从未来来到这里的人,文档现在说“你真的不想在新代码中使用这个模块。如果你忽略这个警告并仍然使用它,qw(:strict ) 模式将为您省去一点痛苦。”
        【解决方案4】:

        详情请见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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-06-20
          • 1970-01-01
          • 2016-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-14
          相关资源
          最近更新 更多