用例是以文本格式对复杂对象图进行长期序列化。
4 回答
简短的回答
如果您希望人类创建/阅读文档(配置文件、报告等),那么您可以考虑 YAML,否则选择 XML(用于机器对机器的通信)。
长答案
长度
XML 和 YAML 大致相同。好的 XML 库可以跳过所有空格,而对于 YAML,它是必需的。一个复杂的 YAML 包含很多缩进空间(不要使用制表符!)
网络故障
YAML 文档的一部分通常是有效文档,因此如果 YAML 文档不完整,则无法自动检测它。XML 解析器将始终检查文档是否至少格式正确,并且可以根据模式自动检查有效性。
语言支持
许多主要的编程语言都支持YAML和 XML。
基本知识
您无需向开发人员(即使是初级)解释什么是 XML。YAML 还没有被广泛使用。
架构
使用 XML,生产者和消费者都可以就 Schema 达成一致,以建立可靠的数据交换格式。
句法
XML 非常丰富:名称空间、实体、属性。
外部依赖
Java 和 Python 在标准库中支持 XML。YAML 需要这些语言的外部依赖项。
到期
XML 规范较旧,而且坚如磐石;而 YAML 仍在建设中。YAML 1.1 包含不一致的地方(甚至有一个wiki来维护错误列表)。
XSLT
如果您需要将 XML 文档转换为另一种格式(XML、HTML、YAML、PDF),您可以使用 XSLT,而对于 YAML,您必须编写程序。
我同意:YAML 更具可读性,并且似乎非常适合开发读/写配置文件。但是机器对机器的通信几乎没有什么好处。此外,对于文本标记(xml 的传统优势,如 xhtml、docbook),xml 更好。
特别是对于对象序列化,我想不出使用 YAML 的充分理由。
事实上,我建议改为考虑 JSON:它基于对象(或结构,因为没有行为)模型,而不是分层 (xml) 或关系 (SQL) 模型。因此,它更适合对象数据。但是 XML 也可以正常工作,并且有很多很好的工具。
最后一件事:术语“长期”和“对象序列化”不能混用。后者意味着紧密耦合:您的对象会发生变化,序列化也会发生变化。实际对象序列化不应该用于存储数据,数据绑定/映射更合适。但可能是您在“使用方便的对象包装器存储/恢复数据”的意义上使用序列化;如果是这样,那很好。
XML 有 xpath 和 xquery。
但是 YAML 具有复杂的键,并允许您使用别名(& * 语法)将一个值复制到许多地方。
我认为 YAML 的优势不是人类可读性,就像他们说的那样……我可以很好地阅读格式正确的 XML。
实际上 YAML 的强项是人类可写性。如果您在构建数据模型等时在 iPhone 上快速输入一些数据,则 YAML 更容易输入。别名非常棒。
然后你可以把它转换成任何东西。
YAML 的更高级的特性,比如严格的类型和标签,我从来没有使用过。YAML 人目前正在讨论发布一个“微型 YAML”来与 JSON 竞争,对于我们这些使用它的人来说,基本上就像使用带有别名的更干净的 JSON 一样。
但是正如其他人指出的那样,XML 作为一种标记语言更好,您希望在其中直观地区分数据的哪些部分对最终用户可见。
如果您使用 YAML,则通过网络传输的字节数可能会稍微少一些。我认为还不够重要,但在某些情况下它可能是相关的。我还认为 YAML 更易于在文本编辑器中阅读和使用,但这确实有点主观,如果这不是正常的使用场景,这并不重要。
如果带宽不是一个因素,并且您不会经常在文本编辑器中使用 YAML/XML,我认为您使用哪个并不重要。