Perl XML:如何在xml自闭标签中保留空白?

时间:2018-09-24 06:25:09

标签: xml perl

我正在使用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()

2 个答案:

答案 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/>,它将被编码:&lt;tab/&gt;。仅当存在CDATA section时,如果碰巧包含了该错误,我们才会遇到麻烦,并且不应更改。

但是我会冒险的。