如何将数据写入 YAML 文件

5

我正在尝试构建一个简单的Windows表单,它应该能够将值写入YAML配置文件。发布后,exe文件将保存在config目录中。

private void buttonSaveSettings_Click(object sender, EventArgs e)
{
    string hostname = hostnameBox.Text;

    var path = "C:\\Users\\Nick\\Desktop\\packages\\doctrine.yaml";
    var deserializer = new YamlDotNet.Serialization.Deserializer();

    try
    {
        using (var reader = new StreamReader(path))
        {
            var obj = deserializer.Deserialize<Dictionary<object, object>>(reader);
            var doctrine = (Dictionary<object, object>)obj["doctrine"];
            var dbal = (Dictionary<object, object>)doctrine["dbal"];
            var connections = (Dictionary<object, object>)dbal["connections"];
            var dict = (Dictionary<object, object>)connections["default"];

            // TODO: Modify the dictionary
            // dict["dbname"] = "test";

            dict["dbname"] = "test";

            using (StreamWriter writer = new StreamWriter(path))
            {
                // Save Changes
                var serializer = new YamlDotNet.Serialization.Serializer();
                serializer.Serialize(writer, obj);
            }
        }
    }
    catch (Exception exception)
    {
        dumpBox.Text = exception.Message;
    }
}

这是Doctrine的配置文件(packages/doctrine.yaml)

doctrine:
    dbal:
        default_connection: default
        connections:
            default:
                dbname: dbname
                user: user
                password: password
                host: host
                driver: pdo_mysql
                server_version: '10.0.38-MariaDB'

        # IMPORTANT: You MUST configure your server version,
        # either here or in the DATABASE_URL env var (see .env file)
        #server_version: '5.7'
    orm:
        auto_generate_proxy_classes: true
        naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
        auto_mapping: true
        mappings:
            App:
                is_bundle: false
                type: annotation
                dir: '%kernel.project_dir%/src/Entity'
                prefix: 'App\Entity'
                alias: App

我不确定是否仅使用System.IO就能处理该任务,因为我们可能需要一些额外的解析器。

问题是,我该如何重写属于doctrine/dbal/connections/default的每个键的值?

2个回答

4
您可以进行以下操作:
  • 首先安装YamlDotNet (如果您使用的是 .NET Core,请执行 dotnet add package YamlDotNet --version 8.1.2;否则,请执行包管理器命令 PM> Install-Package YamlDotNet -Version 8.1.2)。

将代码适配成符合您需求的形式。

var path = "/path/to/file.yaml";
var deserializer = new YamlDotNet.Serialization.Deserializer();

try {
    using var reader = new StreamReader(path);
    var obj = deserializer.Deserialize<Dictionary<object, object>>(reader);
    var doctrine = (Dictionary<object, object>)obj["doctrine"];
    var dbal = (Dictionary<object, object>)doctrine["dbal"];
    var connections = (Dictionary<object, object>)dbal["connections"];
    var dict = (Dictionary<object, object>)connections["default"];
    reader.Close()

    // TODO: Modify the dictionary
    // dict["dbname"] = "test";                    

    using var writer = new StreamWriter(path);
    // Save Changes
    var serializer = new YamlDotNet.Serialization.Serializer();
    serializer.Serialize(writer, obj);
} catch (Exception e) {
    // TODO: manage
}  

太好了,看起来有解决方案!我必须提到一个警告。它说:“由于正在被另一个进程使用,因此无法访问文件'C:\ packages \ doctrine.yaml'。”我想算法中可能有问题需要修复。可能的原因是什么? - Stephan882
我已经更新了帖子,这样你就可以看到了。我直接在变量中设置路径。如果我可以问一下,你是如何设置你的路径的?这可能是问题所在。目前,我只是为了测试而指向其完整路径,我想它也应该能够正常工作。 - Stephan882
我正在使用相对于当前目录的路径。查看 - Jorge Alejandro
让我们在聊天中继续这个讨论 - Jorge Alejandro
当然,我很蠢,我没有意识到,因为我使用了 using (reader var...),我忘记了它,但由于它们是嵌套的,所以它没有关闭,似乎Linux有更好的文件管理,所以它在那里工作,我绝对很蠢,我非常高兴它能够工作。 - Jorge Alejandro
显示剩余4条评论

-1

已经有一个适用于.NET项目的Yaml库。

YamlParser parser = new YamlParser();
TextInput input = new TextInput(File.ReadAllText(yamlFilePath));
bool success;
YamlStream yamlStream = parser.ParseYamlStream(input, out success);
if (success)
{
    foreach (YamlDocument doc in yamlStream.Documents)
    {
        // access DataItem by doc.Root
    }
}
else
{
    MessageBox.Show(parser.GetEorrorMessages());
}

或者:

YamlStream yamlStream = YamlParser.Load(yamlFilePath);

如果需要其他帮助,请访问http://yaml-net-parser.sourceforge.net/

您可以查看此fiddle链接https://dotnetfiddle.net/rrR2Bb


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接