我正在使用perl脚本处理XML文件以读取和写入数据,这些xml文件具有诸如 之类的自动关闭元素,其中包含空格,这些空格已删除并更改为或当使用empty_tags =>'html'时。 有什么办法可以保留空白吗?
XML示例:“ test.xml”
<article>
<title>This is title</title>
<p>Name:<tab /></p>
<p>Department:<tab /></p>
</article>
Perl代码:
use warnings;
use utf8;
use XML::Twig;
my $xmlname = "test.xml";
my $twigdoc = XML::Twig->new(empty_tags=>'html');
$twigdoc->parsefile($xmlname);
$twigdoc->print;
exit()
答案 0 :(得分:2)
您担心的是差异与符合标准的XML处理器无关。
如果您对这种差异很敏感的XML数据使用者,则该消耗的应用程序会 损坏,应予以修复 。您不应尝试通过将其解决为您的问题而使该问题永久存在。
答案 1 :(得分:0)
有时您无法更改使用者。我去过那儿。真令人沮丧。
在这些情况下,您需要记住您正在使用Perl,而Perl擅长文本处理。 XML是文本。可以使用正则表达式来操纵文本。而且,只要您不尝试使用正则表达式来解析 XML,您就很成功。让我们务实。
在上面运行代码后,输出将如下所示。
<article><title>This is title</title><p>Name:<tab></tab></p><p>Department:<tab></tab></p></article>
让我们暂时忘记这是具有结构且有意义的XML数据。如果我们不知道,那只是文本流。包含
的文本<tab></tab>
但是我们实际上希望它包含
<tab />
那我们该怎么办?我们正则表达式出来!
use strict;
use warnings;
use XML::Twig;
my $twigdoc = XML::Twig->new(
empty_tags => 'html',
output_filter => sub {
$_[0] =~ s{<tab></tab>}{<tab />}gr;
}
);
$twigdoc->parse(<<'XML');
<article>
<title>This is title</title>
<p>Name:<tab /></p>
<p>Department:<tab /></p>
</article>
XML
$twigdoc->print;
此代码利用了output_filter
functionality that XML::Twig provides。它可能需要一个子例程引用,因此进行替换很简单。
我们甚至可以确保我们不会破坏任何东西。如果内容包含<tab/>
,它将被编码:<tab/>
。仅当存在CDATA
section时,如果碰巧包含了该错误,我们才会遇到麻烦,并且不应更改。
但是我会冒险的。