Почему содержимое не записывается в документ yaml?

#c# #yaml #yamldotnet

#c# #yaml #yamldotnet

Вопрос:

Я намереваюсь записать массив элементов в файл yaml, формат должен быть таким:

 - country: Denmark
  city: Copenhagen
- country: Italy
  city: Rome
  

Итак, я написал этот метод:

 public static void Write(MyItem myItem)
{
    var myFilePath = "myYamlDoc.yaml";

    var yamlStream = new YamlStream();

    var yamlNode = new YamlMappingNode
        {
            { "country", new YamlScalarNode(myItem.Country) { Style = ScalarStyle.Literal }},
            { "city", new YamlScalarNode(myItem.City) { Style = ScalarStyle.Literal }};
        var yamlDocument = new YamlDocument(yamlNode);
        yamlStream.Add(yamlDocument);
    
}
  

Ошибок нет, но содержимое также не записывается / сохраняется в документ yaml…
помогите?

Последующее редактирование:

 public static void Write4()
        {
            var myFilePath = "myFile3.yaml";

            var items = new MyItem[]
                {
                    new MyItem()
                    {
                        Prop1= "A4786",
                        Prop2 = "Water Bucket (Filled)",
                        Prop3 = "X"
                    },
                    new MyItem()
                    {
                        Prop1= "A4786",
                        Prop2 = "Water Bucket (Filled)",
                        Prop3 = "X"
                    }
                };

            var serializer = new SerializerBuilder().Build();
            var yamlText = serializer.Serialize(items);

            var yamlStream = new YamlStream();

            using (StreamWriter writer = System.IO.File.Exists(myFilePath) ? System.IO.File.AppendText(myFilePath) : System.IO.File.CreateText(myFilePath))
            {
                writer.WriteLine(yamlText);
                yamlStream.Save(writer, false);
            }
}
  

Работает так, но считаете ли вы, что это правильный способ сделать это? В библиотеке они используют эмиттеры? для сохранения, но документации не хватает или, по крайней мере, я ее не нахожу. Есть ли лучшая библиотека yaml, которую я мог бы использовать? Почему бы не записывать напрямую в yamlStream, я имею в виду, зачем вообще использовать StreamWriter?

Комментарии:

1. Что такое YamlStream ? И независимо от того, что это такое, нигде в вашем коде вы не ссылаетесь на writer и YamlStream , поэтому никакая библиотека, из которой это сделано, не знает о вашем writer потоке.

2. Джон, я оставил эту часть по ошибке, я просто понял и вернулся сюда, чтобы удалить ее. Раньше я использовал поток для записи обычного (не в формате yaml) текста в документ yaml (и это сработало, но было просто промежуточным тестом …). Итак, удалив это, я понятия не имею, как указать путь к документу, если я не связываю поток с yaml… Я хочу просто напрямую связать узел yaml с документом yaml, указать ему путь и все. А затем расширяется от узла до массива узлов.

3. Итак, ваш вопрос не о записи в файл? И все же, что такое YamlStream ? Что такое YamlMappingNode ? Я предполагаю, что вы используете библиотеку, но какую?

4. Да, речь идет о записи узла (или массива узлов) в файл с соблюдением формата yaml. StreamWriter не помог соблюдать формат yaml (я думаю — или я неправильно его использовал).

5. Итак, вы хотите Save преобразовать Yaml в файл?

Ответ №1:

Я предполагаю, что вы используете YamlDotNet. Класс, называемый YamlStream, на самом деле не является потоком .NET (он не наследуется Stream ). Это скорее YamlDocumentCollection.

Поэтому он никогда не сохранит документы куда-нибудь.

Если вы посмотрите на свой первый пример кода, вы никогда не используете имя файла, и поэтому файл никогда не сохраняется на диске.

Во втором примере это работает, поскольку «YamlStream» может принимать TextWriter производный класс (в вашем случае StreamWriter ) и использовать его для сохранения содержимого на диск.

Однако я бы написал этот код как:

 using (var fileStream = new FileStream(myFilePath, FileMode.Append, FileAccess.Write))
{
    using (StreamWriter writer = new StreamWriter(fileStream))
    {
        writer.WriteLine(yamlText);
        yamlStream.Save(writer, false);
    }
}
  

Поскольку это делает намерение более ясным (всегда добавляйте в файл). В противном случае просто используйте FileMode.Create , чтобы всегда перезаписывать файл (если он существует).