Я полностью осведомлен о проблеме с дубликатами ключей в спецификации yaml:
Содержимое узла сопоставления представляет собой неупорядоченный набор пар узлов ключ: значение с тем ограничением, что каждый из ключей уникален.
Например, я создал файл yaml, используя библиотеку yaml-cpp с вложенной древовидной структурой, которая выглядит так:
work:
- run:
type: workout
figures:
start_time:
start: 9
end_time:
end: 12
- run:
type: workout
figures:
start_time:
start: 16
end_time:
end: 18
Очевидно, что у него есть повторяющиеся ключи, и yaml-validator рассматривает его как нормальный файл. Но когда я пытаюсь разобрать его с помощью yaml-cpp
void parser(const std::string& path)
{
const YAML::Node& baseNode = YAML::Loadfile(path);
for (const auto& item : baseNode["work"]);
{
switch (item.second.Type()) //Error not a valid yaml node
{
//If it is a NullNode
case YAML::NodeType::Null:
break;
//If it is a ScalarNode
case YAML::NodeType::Scalar:
scalarNodeIterator(item.second, item.first.as<std::string>());
break;
//If it is a SequenceNode
case YAML::NodeType::Sequence:
sequenceNodeIterator(item.second, item.first.as<std::string>());
break;
//If it is a MapNode
case YAML::NodeType::Map:
mapNodeIterator(item.second, item.first.as<std::string>());
break;
}
}
}
Что я хочу:
Как видите, у меня есть собственные итераторы, зависящие от узла, для чтения любого дерева yaml. Мне нужно использовать повторяющиеся ключи, и когда я это сделаю, синтаксический анализатор должен работать по назначению.
Можно ли реализовать синтаксический анализатор, который может читать такие узлы, как run
? Если да, то как я могу этого достичь? Если нет, есть ли другие решения для создания файла yaml с читаемыми дубликатами ключей?