Обратите внимание, что XML :: Simple устарела, и сам автор рекомендует использовать другие модули. Однако я не знаю, какой модуль можно использовать для простого выгрузки структур данных в XML (за исключением, может быть, XML :: Dumper, но у него совсем другая структура вывода) без "ручного" создания структуры данных.
Для желаемого формата вывода необходимо установить следующие параметры для функции XMLOut:
print XMLout($data,NoAttr => 1, RootName => 'root');
Однако при этом все равно останется тег «message», который является пустым массивом. и XML :: Simple, кажется, молча отбрасывает его (ууу!).
<root>
<output>
<product_artifacts>
<artifacts>
<artifact_created>10-25-19 15:52:02</artifact_created>
<artifact_digital_size>123</artifact_digital_size>
<artifact_download_link>http://abc:rt/ </artifact_download_link>
<artifact_number>123/234</artifact_number>
<artifact_revision>AB1</artifact_revision>
</artifacts>
<variant_name>test_var</variant_name>
</product_artifacts>
</output>
<status>Success</status>
</root>
Необработанным обходным путем для этого было бы установить его в undef и установить для параметра SuppressEmpty значение undef, но это все равно не сгенерирует идентичный вывод, так как XML :: Simple не похоже, генерирует пустые теги.
См. https://ideone.com/kwqZzo для демонстрации и полного кода.
Кроме того, вы можете создать xml вручную, используя XML :: Writer , но это сильно зависит от данных. Вы можете попробовать рекурсивный подход, но он будет хрупким. Для точных json и выходных данных в вопросе вы можете использовать что-то вроде этого:
#!/app/perl/5.16.2/LMWP3/bin/perl
use strict;
use warnings;
binmode STDOUT, ":utf8";
use utf8;
use JSON;
use XML::Writer;
# Read input file in json format
my $json = qq(
{
"status": "Success",
"output": {
"product_artifacts": [
{
"variant_name": "test_var",
"artifacts": [
{
"artifact_created": "10-25-19 15:52:02",
"artifact_download_link": "http://abc:rt/ ",
"artifact_digital_size": 123,
"artifact_number": "123/234",
"artifact_revision": "AB1"
}
]
}
]
},
"message": []
}
);
my $data = decode_json($json);
my $writer = XML::Writer->new( OUTPUT => 'self',DATA_MODE => 1, DATA_INDENT => 4);
$writer->xmlDecl("UTF-8");
$writer->startTag('root');
$writer->dataElement(status => $data->{status});
$writer->startTag('output');
for my $p (@{$data->{output}{product_artifacts}}) {
$writer->startTag('product_artifacts');
$writer->dataElement($_ => $p->{$_}) for qw(variant_name);
for my $a (@{$p->{artifacts}}) {
$writer->startTag('artifacts');
$writer->dataElement($_ => $a->{$_}) for qw(artifact_created
artifact_download_link
artifact_digital_size
artifact_number
artifact_revision);
$writer->endTag('artifacts');
}
$writer->endTag('product_artifacts');
}
$writer->endTag('output');
$writer->emptyTag('message');
$writer->endTag('root');
print $writer->to_string();
print "\n";