Попытка создать файл XML, который XML :: Simple будет анализировать в конкретной структуре данных, может быть настоящей болью. Я считаю, что самый простой способ справиться с этим - начать с нужной вам структуры данных, запустить ее через XMLout , а затем изменить полученный XML-код по своему усмотрению.
use strict;
use warnings;
use XML::Simple;
my $config = {
'indicator' => 'edit',
'elements' => [
{
'name' => 'overrides',
'label' => 'Over Rides',
'type' => 'Fieldset',
'attributes' => {
'title' => 'Use these fields to override the csv value with this constant value',
},
'elements' => [
{
'type' => 'text',
'name' => 'client',
'label' => 'Client',
},
{
'type' => 'Select',
'name' => 'bidy_type',
'label' => 'Bid Type',
'options' => [
[ 'bid' => 'Bid' ],
[ 'approved' => 'Approved' ],
],
},
{
'type' => 'text',
'name' => 'client_pay',
'label' => 'Client Pay',
},
{
'type' => 'text',
'name' => 'due_date',
'label' => 'Due Date',
},
{
'type' => 'text',
'name' => 'start_date',
'label' => 'Start Date',
},
{
'type' => 'Radiogroup',
'name' => 'category',
'label' => 'Category',
'options' => [
[ 'grass_cut_initial' => 'Grass Cut - Initial' ],
[ 'grass_cut_recut' => 'Grass Cut - Recut' ],
[ 'secure' => 'Secure' ],
[ 'winterization' => 'Winterization' ],
[ 'rehab' => 'Rehab' ],
[ 'custom' => 'Custom' ],
],
},
{
'type' => 'text',
'name' => 'contractor',
'label' => 'Contractor',
},
{
'type' => 'text',
'name' => 'contractor_pay',
'label' => 'Contractor Pay',
},
],
},
],
};
my $xml = XMLout($config, 'KeyAttr' => []);
print "$xml\n";
Результат
<opt indicator="edit">
<elements label="Over Rides" name="overrides" type="Fieldset">
<attributes title="Use these fields to override the csv value with this constant value" />
<elements label="Client" name="client" type="text" />
<elements label="Bid Type" name="bidy_type" type="Select">
<options>
<anon>bid</anon>
<anon>Bid</anon>
</options>
<options>
<anon>approved</anon>
<anon>Approved</anon>
</options>
</elements>
<elements label="Client Pay" name="client_pay" type="text" />
<elements label="Due Date" name="due_date" type="text" />
<elements label="Start Date" name="start_date" type="text" />
<elements label="Category" name="category" type="Radiogroup">
<options>
<anon>grass_cut_initial</anon>
<anon>Grass Cut - Initial</anon>
</options>
<options>
<anon>grass_cut_recut</anon>
<anon>Grass Cut - Recut</anon>
</options>
<options>
<anon>secure</anon>
<anon>Secure</anon>
</options>
<options>
<anon>winterization</anon>
<anon>Winterization</anon>
</options>
<options>
<anon>rehab</anon>
<anon>Rehab</anon>
</options>
<options>
<anon>custom</anon>
<anon>Custom</anon>
</options>
</elements>
<elements label="Contractor" name="contractor" type="text" />
<elements label="Contractor Pay" name="contractor_pay" type="text" />
</elements>
</opt>
Не совсем тот XML, который вы ожидаете, но он выполняет свою работу. Вы также можете дважды проверить, что это работает, запустив его обратно через XML в и изучив получившуюся структуру данных:
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml = '...';
my $config = XMLin($xml, 'KeyAttr' => []);
print Dumper($config);
Причина, по которой я использую опцию KeyAttr
, заключается в следующем предостережение :
Если вы хотите «в оба конца» произвольно
структуры данных от Perl до XML и
вернемся к Perl, тогда вам стоит
отключить сворачивание массива (используя
Опция KeyAttr) как с XMLout (), так и с
с XMLin ().
Кроме того, я не могу найти способ передать опции в Config :: Any через load_config_file (я не тратил много времени на поиск документов HTML :: FormFu хотя). Это означает, что вам, возможно, придется самостоятельно использовать XML :: Simple , чтобы передать структуру данных в заполнить .
Как видите, файл конфигурации XML на самом деле не самый простой подход при работе с HTML :: FormFu. Если вы открыты для других подходов, я бы предложил использовать что-то, что намного лучше сопоставляется со структурами данных Perl, например, YAML (возможно, это одна из причин, по которой он используется в примерах документации ). Лично я просто использую Perl для создания своих форм и вставляю код / конфигурацию в модуль.