Как ни странно, но ответ на этот вопрос есть на оффициальной вики, в разделе работы с KeyValues. Сам не до конца понимаю, как оно работает, но кидаю пример кода, который шарит по всем ключам и секциям в KV.
BrowseKeyValues(Handle:kv)
{
do
{
// You can read the section/key name by using KvGetSectionName here.
if (KvGotoFirstSubKey(kv, false))
{
// Current key is a section. Browse it recursively.
BrowseKeyValues(kv);
KvGoBack(kv);
}
else
{
// Current key is a regular key, or an empty section.
if (KvGetDataType(kv, NULL_STRING) != KvData_None)
{
// Read value of key here (use NULL_STRING as key name). You can
// also get the key name by using KvGetSectionName here.
}
else
{
// Found an empty sub section. It can be handled here if necessary.
}
}
} while (KvGotoNextKey(kv, false));
}
Полагаю, что основная суть такова:
1. Прыгаем в нужную нам секцию.
2. Идем к её FirstKey.
3. Дальше с помощью do ... while (KvGoNextKey) просматриваем как SectionName название всех ключей (можно и их число посчитать).
Если нужно дальше изъять их значения, то в шаге три я обычно записываю в массив названия всех ключей, а потом делаю шаг один, и уже в массиве названия всех ключей, значит тупо for (new i = 0; i < ArraySize; i++) KvGet... ();
P.S. Подобным образом можно считывать Kv с вложением более трех уровней.