Иногда вы не можете изменить потребителя.Я был там.Это расстраивает.
В этих случаях вам нужно помнить, что вы делаете 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
функциональность, которую XML :: Twig предоставляет .Это может занять ссылку на подпрограмму, поэтому сделать эту замену тривиально.
Мы даже можем быть уверены, что с этим ничего не сломаем.Если содержимое содержит <tab/>
, оно будет закодировано: <tab/>
.Только если бы была CDATA
секция , мы бы попали в беду, если бы это могло содержать это, и это не должно быть изменено.
Но я бы рискнул.