Большую часть времени конфигурация может быть выполнена только с опциями, которые предоставляет XML::Simple
. Обычно он автоматически сворачивает данные в простую структуру данных, которую можно логически воспроизвести; он отлично подходит для форматов хранения данных, но не настолько силен, когда дело доходит до соответствия формату документа. К счастью, несмотря на то, что он «простой», он невероятно мощный.
Для управления порядком вывода элементов у вас есть несколько вариантов. Вы можете использовать массивы, которые гарантируют порядок данных. Однако, похоже, вам нужен определенный порядок значений для одного тега.
Сортировка ключей также является автоматической функцией. Пока ключи у вас в алфавитном порядке, они будут гарантированно отсортированы в указанном порядке.
Но много раз, особенно с очень конкретными схемами, это не сработает. К счастью, XML :: Simple по-прежнему поддерживает способ его настройки: вы должны использовать интерфейс OO и переопределить метод sorted_keys. Вот пример:
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
package MyXMLSimple; # my XML::Simple subclass
use base 'XML::Simple';
# Overriding the method here
sub sorted_keys
{
my ($self, $name, $hashref) = @_;
if ($name eq 'supertag') # only this tag I care about the order;
{
return ('tag1', 'tag3','tag4','tag10'); # so I specify exactly the right order.
}
return $self->SUPER::sorted_keys($name, $hashref); # for the rest, I don't care!
}
package main; # back to main code
my $xmlParser = MyXMLSimple->new( # Create the parser, with options:
KeepRoot => 1, # gives us our root element always.
ForceContent => 1, # ensures that content stays special
);
my $structure = {
supertag => {
tag1 => { content => 'value 1' },
tag10 => { content => 'value 2' },
tag3 => { content => 'value 3' },
tag4 => { content => 'value 4' },
},
};
my $xml = $xmlParser->XMLout($structure);
print "The xml generated is:\n$xml\n";
print "The read in structure then is:\n" . $xmlParser->XMLin($xml) . "\n";
Это даст нам:
The xml generated is:
<supertag>
<tag1>value 1</tag1>
<tag3>value 3</tag3>
<tag4>value 4</tag4>
<tag10>value 2</tag10>
</supertag>
The read in structure then is:
$VAR1 = {
'supertag' => {
'tag10' => {
'content' => 'value 2'
},
'tag3' => {
'content' => 'value 3'
},
'tag1' => {
'content' => 'value 1'
},
'tag4' => {
'content' => 'value 4'
}
}
};
Проверьте страницу XML :: Simple на CPAN.