Недопустимая ошибка узла yaml при разборе узла последовательности/карты

Я полностью осведомлен о проблеме с дубликатами ключей в спецификации 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 с читаемыми дубликатами ключей?


person MarKS    schedule 20.04.2018    source источник
comment
На самом деле в вашем примере нет повторяющихся ключей. Кроме того, повторяющиеся ключи следует проверять выше уровня парсера, так как парсер не может в каждом случае угадать, равны ли два ключа.   -  person tinita    schedule 20.04.2018


Ответы (1)


В вашем примере нет повторяющихся ключей, как указал @tinita в комментарии.

Вместо этого под ключом «работа» у вас есть список карт, каждая из которых имеет ключ «выполнить» и значение карты.

Вот почему вы получаете ошибку. Когда вы повторяете

for (const auto& item : baseNode["work"])

item будет представлять узел (поскольку вы повторяете последовательность), а не пару ключ/значение. Вам затем придется перебрать его (один) элемент, чтобы прочитать пары ключ/значение.

person Jesse Beder    schedule 21.04.2018