2012-04-03 8 views
0

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

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

или для 4:

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

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

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

ответ

2

С 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

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

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

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

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

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

+0

Я хочу установить намереваюсь для вывода значения, которое я получаю в PARAMS, но теперь я прочитал в вашей ссылке, что: «libxml2 использует жестко закодированное отступы из двух символов пробела на уровень отступа. Это значение не может быть изменено во время выполнения.«Поэтому я думаю, что не могу изменить количество пробелов в libxml, поэтому я должен сделать это по-другому. –

+0

Первая ссылка мертва. –

+0

thx, исправил ее –

0

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

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

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

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

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

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

Вы можете посмотреть небольшой пример того, как сгенерировать правильный xml в perl на my blog.

+0

Да, это поможет мне форматировать xml, но я не могу установить, сколько места символы, используемые для отступов, и это то, что мне нужно. –

+0

А, извините, я этого не понял. –