Рассмотрим абстрактный автономный парсер XML в массив.
Что хочется:
<root>
<title>title1</title>
<title>title2</title>
</root>
Получить в виде:
{ 'root' =>
{
'title' => ['title1', 'title2' ]
}
}
<root>
<time>1234567</time>
</root>
в виде
{ 'root' => { 'time' => 1234567 } }
Понятно, чтобы по parsed_data['root']['time'] или по parsed_data['root']['titles'][0] удобно доставать данные.
И вот тут облом. При парсинге заранее неизвестно, массив элементов будет или одиночный элемент. Т.е. если грантированно более одного элемента, то всё понятно: если уже есть одиночный распарсеный элемент - преобразуем его в массив и новые добавляем в массив.
Но тогда, если в массиве значений только одна запись, получим ошибку:
<root>
<title>title1</title>
</root>
получим
{ 'root' =>
{
'title' => 'title1'
}
}
вместо
{ 'root' =>
{
'title' => ['title1']
}
}
Например, RSS с одной записью:
<channel>
<item><link>...</link></item>
</channel>
будет давать совсем другой результат, чем с несколькими:
<channel>
<item><link>...</link></item>
<item><link>...</link></item>
<item><link>...</link></item>
</channel>
«Правильное» решение приходит в голову такое. Все элементы парсить как массивы изначально. Т.е. в случае одиночных записей будем просто иметь массив из одного элемента:
<root>
<time>1234567</time>
</root>
{ 'root' => [{ 'time' => [1234567] } ]}
Но некрасиво каждый раз писать, типа data['root'][0]['time'][0]
Нет ли какого-то более изящного решения? :-/