- 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/
当用户将鼠标悬停在 anchor 上时,除了悬停的 anchor 之外的每个 anchor 都会改变颜色。假设有 link1 link2 link3。如果用户将鼠标悬停在 link1 上,我希望更改
'; echo "".$value['eventsearchresultwhat'].""; echo "\n"; echo $value['eventsearchr
我有几个多列下拉菜单作为我的主导航的一部分。由于某种原因,两个多列下拉菜单中每个链接周围的 anchor 命中区域位于链接本身上方。我该如何修复它,使点击区域像普通 anchor 一样以链接文本为中心
我正在 android studio 中创建内部构建 AR 导航。我正在寻找一种方法将 anchor 与其他 anchor 或 anchor 节点/节点“连接”起来。我不确定使用哪一个。基于我将强制用
我有很多 anchor 可以在 doxygen 中描绘,例如 \anchor pic_foo \image html foo.gif "My Caption" \anchor pic_bar \ima
我有 3 个 anchor block ,当我加载页面时,我需要 3 个不同的随机 background-colors。然而,只有第一个 anchor 随机改变 background-color。这是
我有一个带有 float 顶部导航栏的网页。我想将 anchor 链接添加到目录以快速定向到页面上的其他位置。 #top { display: flex; z-index: 100; ba
我无法理解为什么将 text-align 属性设置为 right 值,将 span 标签移出 anchor 标签区域(溢出)? HTML文件的结构 a.btn{ border: 1px solid
我需要使用 Jquery 将类“Selected”添加到一个 anchor ,捕获它的唯一方法是通过其属性“active=true”。然后,当用户选择其他 anchor 时,新 anchor 将被设置
我在 hubspot 上有一个基于搜索词查询动态生成的搜索列表页面。 HTML结构如下: a class="hs-search-results__title" href="www.somethi
标题隐晦,但很难解释。使用 Firefox,前往 http://images.google.com进行随机搜索,然后将第一个搜索结果拖到地址栏。您会看到它转到具有图像 anchor 的页面。然后单击“
我正在为 vue-router 不滚动/导航到 anchor 标签(例如:#anchor)而苦苦挣扎。我在 Stack Overflow 上阅读了各种解决方案,但到目前为止都没有奏效。 请在下面找到我
我正在制作 AR 应用程序。要求很简单。在“配置阶段”,我启动应用程序并将一个立方体放在房间的地板上,然后关闭它。稍后当我再次启动应用程序时,当相机面向同一楼层时,立方体应该留在那里。根据我发现的信息
我正在 WordPress 中通过简码展示一组产品。显示屏上有图像和按钮。 问题:只有照片包含指向单个产品页面的链接。关联的按钮没有指向单个产品页面的链接。 这是当前代码:
我正在尝试做一件奇怪的事情。我将解释一般情况,然后按照我想要执行的步骤进行。我有一个 内的项目列表。当我按下一个元素时,必须打开一个模式。在这个模态中,有与 相同的元素。但详细解释了。当模式打开时
尝试从 anchor 克隆文本并将其设置为同一 anchor 的标题属性,但不了解如何使用正确语法的逻辑。 $(document).ready(function () { $('.desc a').c
--- #File A - Lunch: &01 - Chicken - Rice - Sallad ... --- #File B - Mon
我的用例是: 点击屏幕并将“点”保存为起始 anchor 第二次点击屏幕并将“点”保存为结束 anchor 按下按钮将对象从开始 anchor 移动到结束 anchor 我已经构建了自己的节点,该节点
我的菜单和基于#anchors 的导航有问题。我正在使用 JS 函数在滚动时将菜单置于顶部(#stickyheader)。我的菜单上有一个 div,滚动时会消失(#unstickyheader)。该
我目前有这个基础页面淡入淡出脚本函数,当前针对所有 anchor ('a'),但不确定如何准确排除具有类(.noFade)的某个 anchor 淡出。 JS: $(document).ready(fu
我是一名优秀的程序员,十分优秀!