保留注释的数据结构格式(YAML 或诸如此类)的往返解析,用于编写配置

Posted

技术标签:

【中文标题】保留注释的数据结构格式(YAML 或诸如此类)的往返解析,用于编写配置【英文标题】:Round-trip parsing of data structure format (YAML or whatnot) preserving comments, for writing configuration 【发布时间】:2011-10-19 22:12:40 【问题描述】:

我一直在几个应用程序中使用 YAML 作为配置文件格式,并且一切顺利,除了一件事:当我的程序需要在 YAML 配置文件中写入/修改配置变量时,它会通过加载和转储来破坏格式和 cmets整个文件/结构。

(嗯,实际上 YAML 还有一个问题。大多数用户,其中许多不是程序员,都会被 YAML 规则的细节绊倒,比如某些地方空格的重要性。但这不是主要的抱怨.)

我更喜欢的是 YAML 加载器/转储器,它可以进行往返解析(保留所有空格和 cmets),或者具有此类解析器的其他一些人类可读的序列化格式。我什至考虑使用 Perl 文档和 PPI,因为 PPI 是一个往返安全的解析器。或者也许 PPI 可以处理 YAML 或类似格式?我宁愿不使用 XML,在此之前我会求助于 INI+(JSON|YAML|... for key values)。

有什么建议或指示吗?

【问题讨论】:

【参考方案1】:

是的,你和所有认为 哇,yaml 听起来很酷,简单地说,它不存在的人,然而

更新:您可能想要使用 Config::General,它的 apache 配置格式 (xmlish)

不,PPI 不是通用工具,如果你想要 BNF-ness,你想使用 Marpa

在所有 INI/JSON/YAML/XML 中,XML 可能为非程序员提供最好的编辑器支持(听起来很疯狂)

【讨论】:

“它没有退出”——这是否意味着“它不存在”?【参考方案2】:

一种方法是使用“镜头”。请参阅Augeas 了解一种实现方式。

【讨论】:

请注意:Augeas 尚不支持 YAML。 @Raphlink:它告诉我们一些关于 YAML 或 Augeas 的信息。我个人认为它比 Augeas 更能说明 YAML ;-) 我非常喜欢 YAML 用于复杂的配置文件或作为共享序列化数据的进程间手段,但它是一种复杂的格式。 JSON 镜头已经很复杂,但 YAML 增加了更复杂的东西:几种编写数组、引用及其关联指针的方法等。【参考方案3】:

如果您使用的是块结构的 YAML 并且 Python 是可以接受的,那么您 可以使用 Python 包¹ruamel.yaml,它是 PyYAML 和支持 cmets 的往返保存

import sys
import ruamel.yaml

inp = """\
# example
name:
  # details
  family: Smith   # very common
  given: Alice    # one of the siblings
"""

yaml = ruamel.yaml.YAML()

code = yaml.load(inp)
code['name']['given'] = 'Bob'

yaml.dump(code, sys.stdout)

结果:

# example
name:
  # details
  family: Smith   # very common
  given: Bob      # one of the siblings

请注意,行尾 cmets 仍然对齐。

codecode 组成,而不是普通的 listdict 对象 附有 cmets 的包装版本²。

¹ 使用pip install ruamel.yaml 安装。适用于 Python 2.6/2.7/3.3+。 免责声明:我是该软件包的作者。 ² ordereddict 用于映射,以保持顺序

【讨论】:

以上是关于保留注释的数据结构格式(YAML 或诸如此类)的往返解析,用于编写配置的主要内容,如果未能解决你的问题,请参考以下文章

在保留注释的同时在 java 中修改 YAML

我想加载一个 YAML 文件,可能编辑数据,然后再次转储。如何保留格式?

修改现有的 yaml 文件并添加新的数据和注释

yaml格式配置文件

YAML简介

YAML格式的语法