【问题标题】:perl XML::parser adding new lines when printing to fileperl XML::parser 在打印到文件时添加新行
【发布时间】:2014-04-15 18:58:11
【问题描述】:

下面的小程序应该获取格式化的 XML 文件并将其打印到另一个文件,没有新的行或制表符。但是我无法弄清楚生成的文件如何总是包含制表符和换行符,而不仅仅是一个 XML 字符串。

当我打印到控制台时,新行和标签被删除,但文件始终包含标签和新行。

open FH, ">tst.out";
MakeSourceFile($ARGV[0]);
close FH;

sub MakeSourceFile
{
    my $sourceFile  = shift;

    eval { require XML::Parser; import XML::Parser; };
    return if $@;

    my $parser = new XML::Parser();
    $parser->setHandlers(
        Start   => \&start,
        End     => \&end,
        Char    => \&data
    );
    $parser->parsefile($sourceFile);
}

sub start
{
    my ($parseinst, $element, %attrs) = @_;
    print FH "<$element";
    my $attrStr = "";
    map { $attrStr .= " $_=\"$attrs{$_}\""; } keys %attrs;
    print FH "$attrStr>";
}

sub data
{
    my ($parseinst, $data) = @_;
    print FH $data;
}

sub end
{
    my ($parseinst, $element, %attrs) = @_;
    print FH "</$element>";
}

输入文件(test.xml):

<stuff>
    <Profile id="a"></Profile>
    <Profile id="b"></Profile>
    <Profile id="theprofile" extends="a"></Profile>
    <Group>
        <Group>
            <elem stuff="st">stuff here</elem>
        </Group>
    </Group>
</stuff>

输出文件(tst.out):

<stuff>
    <Profile id="a"></Profile>
    <Profile id="b"></Profile>
    <Profile id="theprofile" extends="a"></Profile>
    <Group>
        <Group>
            <elem stuff="st">stuff here</elem>
        </Group>
    </Group>
</stuff>

预期的文件输出(tst.out):

<stuff><Profile id="a"></Profile><Profile id="b"></Profile><Profile id="theprofile" extends="a"></Profile><Group><Group><elem stuff="st">stuff here</elem></Group></Group></stuff>

我认为当我在 VI 中打开文件时会出现某种自动格式化,但事实并非如此;当不涉及 XML::Parser 且未格式化时,我还可以告诉 perl 仅将输出写入文件。这是怎么回事?

【问题讨论】:

标签: xml perl io newline


【解决方案1】:

空格是字符数据,与任何其他文本内容相同。

如果你想删除只有空格的节点然后写

print FH $data if $data =~ /\S/;

您可能想要更进一步,从 $data 中删除前导和尾随空格。

【讨论】:

    【解决方案2】:

    似乎(我不完全了解 XML 规范)空白被 XML 规范或库视为数据。

    if ($data =~ /\S/){ 
        print FH $data;   
    }
    

    这解决了您的具体问题。

    【讨论】:

      【解决方案3】:

      XML::Twig 在解析和打印 XML 文件时会自动去除多余的空格。

      use strict;
      use warnings;
      
      use XML::Twig;
      
      my $data = do { local $/; <DATA> };
      
      my $t = XML::Twig->new();
      $t->parse( $data );
      $t->print;
      
      __DATA__
      <stuff>
          <Profile id="a"></Profile>
          <Profile id="b"></Profile>
          <Profile id="theprofile" extends="a"></Profile>
          <Group>
              <Group>
                  <elem stuff="st">stuff here</elem>
              </Group>
          </Group>
      </stuff>
      

      输出:

      <stuff><Profile id="a"></Profile><Profile id="b"></Profile><Profile extends="a" id="theprofile"></Profile><Group><Group><elem stuff="st">stuff here</elem></Group></Group></stuff>
      

      实际上,要让它使用空格,你必须将以下内容传递给构造函数:pretty_print =&gt; 'indented',

      【讨论】:

        猜你喜欢
        • 2015-11-03
        • 1970-01-01
        • 2018-10-22
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 2012-01-27
        • 1970-01-01
        • 2013-05-15
        相关资源
        最近更新 更多