以下小程序应该使用格式化的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且没有格式化的情况下将输出写入文件。这是怎么回事?
答案 0 :(得分:1)
似乎(我不完全了解XML规范)空格被XML规范或库视为数据。
if ($data =~ /\S/){
print FH $data;
}
这可以解决您的具体问题。
答案 1 :(得分:1)
空白是与任何其他文本内容相同的字符数据。
如果要删除仅空白节点,请编写
print FH $data if $data =~ /\S/;
您可能希望更进一步,从$data
中删除前导和尾随空格。
答案 2 :(得分:0)
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',