Perl XML: как сохранить пробелы в самозакрывающихся тегах xml? - PullRequest
0 голосов
/ 24 сентября 2018

Я работаю над XML-файлом для чтения и записи данных с использованием сценария perl, эти xml-файлы имеют самозакрывающиеся элементы, такие как , в которых есть пробелы, эти пробелы удаляются и изменяются на или когдаused 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 голосов
/ 25 сентября 2018

Иногда вы не можете изменить потребителя.Я был там.Это расстраивает.

В этих случаях вам нужно помнить, что вы делаете 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/>, оно будет закодировано: &lt;tab/&gt;.Только если бы была CDATA секция , мы бы попали в беду, если бы это могло содержать это, и это не должно быть изменено.

Но я бы рискнул.

0 голосов
/ 24 сентября 2018

Вы не

Вас беспокоит различие, которое не имеет значения для соответствующих процессоров XML.

И если у вас есть потребитель данных XML, чувствительный к такой разницето это приложение-потребитель сломано и должно быть исправлено .Вы не должны увековечивать ее проблему, пытаясь решить ее как вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...