对我来说可用意味着:
它正在被实际使用
它有工具支持.(至少是一些简单的编辑)
它具有人类可读的语法(请不要使用尖括号)
此外,我希望它尽可能接近XML,即必须支持属性和属性.所以,请不要YAML.目前,我只想到一种匹配的语言--JSON.你还知道其他选择吗?
YAML是JSON的100%超集,因此拒绝YAML然后考虑使用JSON是没有意义的.YAML完成了JSON所做的一切,但是YAML也提供了更多功能(如引用).
我无法想象除了使用DTD验证文档之外,XML无法做到的任何事情,根据我的经验,从来没有值得花费开销.但是YAML比XML更快更容易打字和阅读.
至于属性或属性,如果你考虑它,它们并不真正"添加"任何东西......它只是一个符号快捷方式,可以将某些内容写为节点的属性,而不是将其放在自己的子节点中.但是如果您喜欢这种便利,您通常可以使用YAML的内联列表/哈希来模拟它.例如:
# YAML Director: name: Spielberg Movies: - Movie: {title: E.T., year: 1975} - Movie: {title: Jaws, year: 1982}
对我来说,无需编写每个节点标签两次的奢侈,加上所有角度支架垃圾的自由,使YAML成为首选.我实际上也喜欢缺少正式的标签属性,因为在我看来,这似乎是一个灰色的XML区域,它不必要地引入两组语法(在编写和遍历时),基本上是相同的概念.YAML完全消除了这种困惑.
JSON是一个非常好的选择,并且有多种语言的工具.它在Web客户端中使用起来非常简单,因为它是原生的javascript.
这里没有提到Prolog,但它是我所知道的表示数据的最佳格式.Prolog程序本质上描述了实体之间复杂关系的数据库.Prolog很容易解析,其中唯一的竞争对手就是这个域中的S表达式.
完整版本程序员经常"忘记"XML实际包含的内容.通常指的是它的一小部分.XML是一种非常复杂的格式,至少包含以下部分:DTD模式语言,XSD模式语言,XSLT转换语言,RNG模式语言和XPath(以及XQuery)语言 - 它们都是XML标准的一部分.另外,还有像E4X这样的伪经.它们中的每一个都有自己的版本,相当多的重叠,不兼容等.很少有XML解析器实现所有这些.更不用说流行解析的多个怪癖和错误,其中一些会导致显着的安全问题,如https://en.wikipedia.org/wiki/XML_external_entity_attack.
因此,寻找XML 替代方案并不是一个好主意.你可能根本不想处理类似的XML.
YAML可能是第二差的选择.它没有XML那么大,但它的设计也试图覆盖所有基础...每次超过十次......以不同的方式,没有人能想到的.我还没有听说过正常工作的YAML解析器.红宝石,使用YAML很多的语言,已经著名搞砸了的缘故吧.我见过的所有YAML解析器都是libyaml的副本,它本身是一个手写的(不是从形式描述生成的)解析器类型,其代码很难验证其正确性(函数跨越数百个)具有复杂控制流的线).正如已经提到的,它完全包含JSON ...在少数Unicode编码技术之上......在同一个文档中,可能还有一些你不想听到的其他东西.
另一方面,JSON与其他两个完全不同.您可以在等待从Maven Nexus下载JSON解析器artefact时编写JSON解析器.它可以做很少,但至少你知道它的能力.没有惊喜.(除了与字符串和双精度编码中的字符转义相关的一些差异).没有隐蔽的攻击.你不能在其中写评论.多行字符串看起来很糟糕.无论您通过属性和属性之间的区别来表达什么,您都可以通过更多嵌套字典来实现.
假设,虽然你想要正确的XML冤枉......好吧,那么像YAML或JSON这样的流行东西都不会这样做.在七十年代中期的一段时间里,时尚与理性思维在某种程度上分道扬.. 那么,你将不得不回到McCarthy,Hoare,Codd和Kowalski开始的所有地方,找出你想要代表什么,然后看看什么是最好的表现技术,无论你是什么试图代表:)
我发现S-Expressions是表示结构化数据的好方法.这是一种非常简单的格式,易于生成和解析.它不支持属性,但是像YAML和JSON一样,它不需要.属性只是XML限制冗长的一种方式.更简单,更清晰的格式就是不需要它们.
杰夫在这里和这里写到了这一点.这应该可以帮助你开始.