Запись вложенных карт и последовательностей в файл yaml с помощью YAML :: Emitter

Я пытался вывести файл yaml с помощью YAML :: Emitter. Например, мне нужно, чтобы что-то подобное было моим файлом yaml.

annotations:
  - run:
     type: range based
     attributes:
      start_frame:
       frame_number: 25
      end_frame:
       frame_number: 39     

Пока что использую мой код

for (auto element : obj)
{
    basenode = YAML::LoadFile(filePath);  //loading a file throws exception when it is not a valid yaml file

    //Check if metadata is already there
    if (!basenode["file_reference"])
    {
        writeMetaData(element.getGttStream(), element.getTotalFrames(), element.getFileHash());
    }

    annotationNode["annotations"].push_back(element.getGestureName());

    annotationNode["type"] = "range based";
    output << annotationNode;

    attributesNode["attributes"]["start_frame"]["frame_number"] = element.getStartFrame();

    attributesNode["attributes"]["end_frame"]["frame_number"] = element.getEndFrame();

    output << typeNode;
    output << attributesNode;

    ofs.open(filePath, std::ios_base::app);
    ofs << std::endl << output.c_str();
}

Я получаю такой результат

annotations:
  - run
type: range based
---
attributes:
 start_frame:
  frame_number: 26
 end_frame:
  frame_number: 57

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

Я даже пробовал использовать что-то вроде этого

annotationNode [0] [тип] = "на основе диапазона"

и результат был таким

0: тип: "на основе диапазона"

Как мне получить недавно добавленный элемент в «аннотации» последовательности?


person MarKS    schedule 07.02.2018    source источник
comment
Полезнее писать полные примеры; ваш код достаточно подробный, но он не показывает, к какому типу относятся ваши переменные (например, когда определено annotationNode?)   -  person Jesse Beder    schedule 10.02.2018


Ответы (1)


Если вы создаете корневой узел annotationNode, просто создайте его и выведите один раз. Вам не нужно будет записывать в эмиттер ни typeNode, ни attributesNode. Например, вы можете написать

YAML::Node annotationNode;
for (auto element : obj) {
  YAML::Node annotations;
  annotations["name"] = element.getGestureName();
  annotations["type"] = ...;
  annotations["attributes"] = ...;
  annotationNode["annotations"] = annotations;
}

output << annotationNode;
person Jesse Beder    schedule 10.02.2018
comment
Спасибо, Джесси, за ответ. Я уже реализовал это, и он работает. Может, я не ясно сформулировал свой вопрос. Мне нужно имя как элемент последовательности, и я добавляю к нему дочерние элементы, а затем следую за элементами с дочерними элементами. Что-то вроде это - person MarKS; 14.02.2018
comment
Может уточнить ваш вопрос? И если у вас есть работающее решение, не стесняйтесь писать его как решение, чтобы другие, у кого есть ваш вопрос, могли увидеть решение. - person Jesse Beder; 17.02.2018
comment
я следил за вашим ответом для этого . Я бы отметил ваш комментарий как ответ, но я все еще не знаю, как добиться такого формата, как показано здесь - person MarKS; 19.02.2018