perl XML :: parser在打印到文件时添加新行

时间:2014-04-15 18:58:11

标签: xml perl io newline

以下小程序应该使用格式化的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中打开文件时会出现某种自动格式,但事实并非如此;我还可以告诉perl只在不涉及XML :: Parser且没有格式化的情况下将输出写入文件。这是怎么回事?

3 个答案:

答案 0 :(得分:1)

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

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

这可以解决您的具体问题。

答案 1 :(得分:1)

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

如果要删除仅空白节点,请编写

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

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

答案 2 :(得分:0)

解析和打印XML文件时,

XML::Twig会自动删除无关的空格。

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 => 'indented',