Perl форматированный вывод xml - PullRequest
0 голосов
/ 03 апреля 2012

Мне нужно отформатировать вывод в xml.Допустим, я получаю число в параметрах, и я хочу, чтобы эти числа означали, сколько будет пробелов от предыдущего родительского элемента.Например, номер 2:

<?xml version="1.0"?>
<LEVEL1>
  <LEVEL2>
    <LEVEL3/>
  </LEVEL2>
</LEVEL1>

или для 4:

<?xml version="1.0"?>
<LEVEL1>
    <LEVEL2>
        <LEVEL3/>
    </LEVEL2>
</LEVEL1>

Мне нравится модуль XML :: LibXML и есть ли способ, как я могу сделать это в этом модуле?Или какой модуль может сделать это?

И еще одна вещь, что, если я хочу иметь возможность установить (или нет) новую строку после заголовка?Как я могу это сделать?Спасибо

Ответы [ 3 ]

2 голосов
/ 03 апреля 2012

С XML :: Twig вы можете использовать set_indent для определения строки отступа:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

my $indent_nb= shift @ARGV || 1;

my $t= XML::Twig->new( pretty_print => 'indented');
$t->set_indent( ' ' x $indent_nb);
$t->parse( \*DATA)->print;

__DATA__
<?xml version="1.0"?>
<LEVEL1>
  <LEVEL2>
    <LEVEL3/>
  </LEVEL2>
</LEVEL1>
2 голосов
/ 03 апреля 2012

Я только что нашел 2 возможных решения для отступа в целом:

1) Через XML :: Twig: http://search.cpan.org/dist/XML-Twig/Twig.pm

2) Через XML :: LibXML: Вы можете установитьдлина отступа с помощью метода toString.

Проверьте описание параметра формата здесь: http://metacpan.org/pod/XML::LibXML::Document

Редактировать: Извините, я был слишком быстр.Ваше намерение состоит в том, чтобы рассчитать размер отступа на основе input-xml - верно?

0 голосов
/ 03 апреля 2012

Вы можете использовать функцию XML :: LibXML "to_string" или "to_file".Оба поддерживают «Формат», как указано в http://metacpan.org/pod/XML::LibXML::Document. В функции to_file это второй параметр после имени файла.

Необязательный параметр $ format устанавливает отступ для выходных данных.Ожидается, что этот параметр будет целочисленным значением, которое указывает, что должен использоваться отступ.Параметр format может иметь три различных значения, если он используется:

Если $ format равен 0, то документ выгружается так, как он был первоначально проанализирован

Если $ format равен 1, libxml2 добавитигнорируемые пробелы, поэтому содержимое узлов легче читать.Существующие текстовые узлы не будут изменены

Если $ format равен 2 (или выше), libxml2 будет действовать как $ format == 1, но он добавляет разрыв в начале и в конце строки для каждого текстового узла.

libxml2 использует жестко закодированный отступ из 2 пробелов на уровень отступа.Это значение не может быть изменено во время выполнения.

Вы можете посмотреть небольшой пример того, как генерировать правильный XML в Perl на моем блоге .

...