- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
"bar", "zip"=>-6ren">
我需要打开一个 YAML 文件,其中使用了别名:
defaults: &defaults
foo: bar
zip: button
node:
<<: *defaults
foo: other
这显然扩展为等效的 YAML 文档:
defaults:
foo: bar
zip: button
node:
foo: other
zip: button
YAML::load
将其读取为。
我需要在此 YAML 文档中设置新键,然后将其写回磁盘,尽可能保留原始结构。
我看过YAML::Store , 但这完全破坏了别名和 anchor 。
是否有任何可用的东西:
thing = Thing.load("config.yml")
thing[:node][:foo] = "yet another"
将文档另存为:
defaults: &defaults
foo: bar
zip: button
node:
<<: *defaults
foo: yet another
?
我选择为此使用 YAML,因为它可以很好地处理这种别名,但编写包含别名的 YAML 在现实中似乎有点惨淡。
最佳答案
<<
的使用指示应将别名映射合并到当前映射中不是核心 Yaml 规范的一部分,但它是 part of the tag repository .
Ruby 提供的当前 Yaml 库 – Psych – 提供 dump
和 load
允许轻松序列化和反序列化 Ruby 对象的方法,并在标签存储库中使用各种隐式类型转换,包括 <<
合并哈希。如果需要,它还提供工具来执行更多低级 Yaml 处理。不幸的是,它不允许选择性地禁用或启用标签存储库的特定部分——这是一个全有或全无的事情。特别是 handling of <<
is pretty baked in to the handling of hashes .
实现您想要的一种方法是提供您自己的 Psych 的子类 ToRuby
类并覆盖此方法,以便它只处理 <<
的映射键作为文字。这涉及覆盖 Psych 中的私有(private)方法,因此您需要小心一点:
require 'psych'
class ToRubyNoMerge < Psych::Visitors::ToRuby
def revive_hash hash, o
@st[o.anchor] = hash if o.anchor
o.children.each_slice(2) { |k,v|
key = accept(k)
hash[key] = accept(v)
}
hash
end
end
然后你会像这样使用它:
tree = Psych.parse your_data
data = ToRubyNoMerge.new.accept tree
使用您示例中的 Yaml,data
然后看起来像
{"defaults"=>{"foo"=>"bar", "zip"=>"button"},
"node"=>{"<<"=>{"foo"=>"bar", "zip"=>"button"}, "foo"=>"other"}}
注意 <<
作为文字键。还有 data["defaults"]
下的哈希 key 是与 data["node"]["<<"]
下的相同哈希键,即它们具有相同的 object_id
.您现在可以根据需要操作数据,当您将其写为 Yaml 时, anchor 和别名仍然存在,尽管 anchor 名称会发生变化:
data['node']['foo'] = "yet another"
puts Yaml.dump data
产生(Psych 使用哈希的 object_id
来确保唯一的 anchor 名称(当前版本的 Psych 现在使用序列号而不是 object_id
)):
---
defaults: &2151922820
foo: bar
zip: button
node:
<<: *2151922820
foo: yet another
如果您想控制 anchor 名称,您可以提供自己的 Psych::Visitors::Emitter
.这是一个基于您的示例并假设只有一个 anchor 的简单示例:
class MyEmitter < Psych::Visitors::Emitter
def visit_Psych_Nodes_Mapping o
o.anchor = 'defaults' if o.anchor
super
end
def visit_Psych_Nodes_Alias o
o.anchor = 'defaults' if o.anchor
super
end
end
与修改后的 data
一起使用时上面的散列:
#create an AST based on the Ruby data structure
builder = Psych::Visitors::YAMLTree.new
builder << data
ast = builder.tree
# write out the tree using the custom emitter
MyEmitter.new($stdout).accept ast
输出是:
---
defaults: &defaults
foo: bar
zip: button
node:
<<: *defaults
foo: yet another
(更新: another question 询问如何使用多个 anchor 执行此操作,我想出了一个 possibly better way to keep anchor names when serializing 。)
关于ruby - 在不破坏 anchor 和别名的情况下读写 YAML 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11665897/
是否可以在 yaml 中存储未转义的 Markdown 文档?我测试过 key:|+ markdown text block that could have any combination o
在解析使用两个空格缩进创建的 YAML(使用 Ruby 2.5/Psych)时,我看到了奇怪的行为。同一个文件,每行缩进四个空格 - 在我看来 - 正如预期的那样。 两个空格: windows:
如何在 yaml 文件中使用三元运算符让 snakeparser 解析它 我使用 groovy 来解析表达式,!e 标签帮助我这样做。现在,当我使用三元运算符时,解析器会失败。 name : abc
是否可以有这样的多行键? mykey: - > key one: keytwo: val 其中 keyone 被视为一个键。我想解析 yaml 以产生: { mykey:
我有一个 YAML 文件,它有几个不同的键,我想为其提供相同的值。此外,我希望该值易于配置。 请参阅下面的 YAML 以了解我的特定用例: --- # Options for attribute_va
在 Perl 中,我可以执行以下操作: my $home = "/home"; my $alice = "$home/alice"; 我可以在 YAML 中执行以下操作: Home: /home Al
如何在 YAML 中表示空字典? IE。它在语义上应该等同于空的 json-object {}。 最佳答案 简短回答:使用 {} 在 yaml 中有两种表示映射(字典)的方法; flow mappin
我需要根据 if 条件再添加一个名称。如果另一个 .yml 文件中的变量值为“yes”,则在列表中添加新名称 我的 yaml 文件中有以下代码: JsNames: - name: 'jquery.m
我是 yaml 新手,我对用于多行的管道符号 (|) 有疑问。 YAML 是否有类似下面的语法? test: |6+ 在下面的两个 YAML 文件中,第一个有效,第二个无效。我不知道是什么原因造成的。
关于 YAML specs关于问号有2.11段: A question mark and space (“? ”) indicate a complex mapping key. Within a b
1。摘要 我找不到如何自动美化我的 YAML 文件。 2。数据 示例: 我有 SashaPrettifyYAML.yaml 文件: sasha_commands: # Sasha comm
我试图理解 YAML 的基本概念。我没有找到任何相关文档可以消除我的疑虑。例如: product: - sku : BL394D quantity : 4
1。摘要 我找不到如何自动美化我的 YAML 文件。 2。数据 示例: 我有 SashaPrettifyYAML.yaml 文件: sasha_commands: # Sasha comm
是否有在 YAML 键中使用空格的正确方法?喜欢 a test: "hello world!" 或 "a test": "hello world!" 或者这只是一个坏主意,应该使用 a_test: "
我在 YAML 中遇到这个问题通过 perl 使用时。谁能告诉我哪里出了问题。 我有一个代码片段 use YAML; ... my $ifdef_struct = YAML::Load(': unde
我有一系列 OpenCv 生成的 YAML 文件,想用 yaml-cpp 解析它们 我在简单的事情上做得很好,但矩阵表示很困难。 # Center of table tableCenter: !!op
有没有办法在启动文件期间加载的 ROS yaml 文件中使用环境变量? 例如, 测试启动: 例子.yaml: vehicle_name: "${VEHICLE_NAME}_robot
Pandoc 支持 YAML metadata block在 Markdown 文档中。这可以设置标题和作者等。它还可以通过更改字体大小、边距宽度和赋予包含的图形的框架大小来操纵 PDF 输出的外观。
我使用当前(2013/12/12)最新版本的 yaml-cpp。 我注意到 YAML::Load("")和 YAML::Load("---\n...") 导致 Null 节点,即 YAML::Load
我喜欢 YAML。 等等,让我备份。我喜欢看起来像这样的 YAML,甚至比 JSON 还要多: Projects: C/C++ Libraries: - libyaml # "C"
我是一名优秀的程序员,十分优秀!