Perl анализирует необычный XML в массив хэшей
Я пытаюсь разобрать XML в массив хэшей, я знаю, что вы можете сделать это с помощью XML::Simple
, но это не дает мне желаемых результатов.
Это мой XML:
<?xml version="1.0" ?>
<resultset>
<table name="PROFILE">
<column name="ID" type="String"/>
<column name="VERSION" type="String"/>
<column name="NAME" type="String"/>
<column name="DESCRIPTION" type="String"/>
<data>
<r><c>0</c><c>1.0</c><c>Default profile</c><c>Default profile</c></r>
<r><c>2</c><c>1.2</c><c>Custom 2</c><c></c></r>
<r><c>3</c><c>6.0</c><c>Custom 3</c><c></c></r>
<r><c>1</c><c>1.15</c><c> For Compare</c><c>The built in profile for compare.</c></r>
<r><c>4</c><c>1.3</c><c>Custom 4</c><c> </c></r>
<r><c>6</c><c>11.0</c><c>Custom 6</c><c>Please only make approved changes.</c></r>
</data>
</table>
</resultset>
Это вывод, который я получаю от использования XML::Simple
, XMLin()
затем печать с использованием Data::Dumper
:
$VAR1 = {
'table' => {
'name' => 'PROFILE',
'data' => {
'r' => [
{
'c' => [
'0',
'1.0',
'Default profile',
'Default profile'
]
},
{
'c' => [
'2',
'1.2',
'Custom 2',
{}
]
},
{
'c' => [
'3',
'6.0',
'Custom 3',
{}
]
},
{
'c' => [
'1',
'1.15',
' For Compare',
'The built in profile for compare.'
]
},
{
'c' => [
'4',
'1.3',
'Custom 4',
{}
]
},
{
'c' => [
'6',
'11.0',
'Custom 6',
'Please only make approved changes.'
]
}
]
},
'column' => {
'ID' => {
'type' => 'String'
},
'NAME' => {
'type' => 'String'
},
'DESCRIPTION' => {
'type' => 'String'
},
'VERSION' => {
'type' => 'String'
}
}
}
};
Но я хочу получить следующий вывод:
$VAR1 = [
{
'ID' => '0',
'NAME' => 'Default profile',
'DESCRIPTION' => 'Default profile',
'VERSION' => '1.0'
},
{
'ID' => '2',
'NAME' => 'Custom 2',
'DESCRIPTION' => '',
'VERSION' => '1.2'
},
{
'ID' => '3',
'NAME' => 'Custom 3',
'DESCRIPTION' => '',
'VERSION' => '6.0'
},
{
'ID' => '1',
'NAME' => ' For Compare',
'DESCRIPTION' => 'The built in profile for compare.',
'VERSION' => '1.15'
},
{
'ID' => '4',
'NAME' => 'Custom 4',
'DESCRIPTION' => ' ',
'VERSION' => '1.3'
},
{
'ID' => '6',
'NAME' => 'Custom 6',
'DESCRIPTION' => 'Please only make approved changes.',
'VERSION' => '11.0'
}
];
Я не знаю, возможно ли получить этот вывод с XML::Simple
или, если это лучший способ, но я просмотрел документацию CPAN и искал в Интернете, и я не знаю, с чего начать. Может кто-нибудь помочь мне разобраться, как получить желаемый результат?
1 ответ
Да, возможно, можно немного поиграть с настройками XML::Simple, чтобы получить результат ближе к тому, что вы хотите. Однако, в конечном счете, вам нужно будет выполнить какой-то перевод, чтобы получить точную цель.
Почему бы просто не сделать перевод с тем, что вам дали? Вероятно, было бы возможно извлечь имена столбцов из XML и обработать странные пустые данные, превращающиеся в хэш-ссылку, но я оставлю это на ваше усмотрение:
use XML::Simple;
use strict;
use warnings;
my $data = do { local $/; <DATA> };
my $xml = XMLin($data);
my @formatted = map {
{
ID => $_->{c}[0],
VERSION => $_->{c}[1],
NAME => $_->{c}[2],
DESCRIPTION => ref $_->{c}[3] ? '' : $_->{c}[3],
}
} @{$xml->{table}{data}{r}};
use Data::Dump;
dd \@formatted;
__DATA__
<?xml version="1.0" ?>
<resultset>
<table name="PROFILE">
<column name="ID" type="String"/>
<column name="VERSION" type="String"/>
<column name="NAME" type="String"/>
<column name="DESCRIPTION" type="String"/>
<data>
<r><c>0</c><c>1.0</c><c>Default profile</c><c>Default profile</c></r>
<r><c>2</c><c>1.2</c><c>Custom 2</c><c></c></r>
<r><c>3</c><c>6.0</c><c>Custom 3</c><c></c></r>
<r><c>1</c><c>1.15</c><c> For Compare</c><c>The built in profile for compare.</c></r>
<r><c>4</c><c>1.3</c><c>Custom 4</c><c> </c></r>
<r><c>6</c><c>11.0</c><c>Custom 6</c><c>Please only make approved changes.</c></r>
</data>
</table>
</resultset>
выходы
[
{
DESCRIPTION => "Default profile",
ID => 0,
NAME => "Default profile",
VERSION => "1.0",
},
{ DESCRIPTION => "", ID => 2, NAME => "Custom 2", VERSION => "1.2" },
{ DESCRIPTION => "", ID => 3, NAME => "Custom 3", VERSION => "6.0" },
{
DESCRIPTION => "The built in profile for compare.",
ID => 1,
NAME => " For Compare",
VERSION => "1.15",
},
{ DESCRIPTION => "", ID => 4, NAME => "Custom 4", VERSION => "1.3" },
{
DESCRIPTION => "Please only make approved changes.",
ID => 6,
NAME => "Custom 6",
VERSION => "11.0",
},
]