对我来说,可用意味着:
- 它在现实世界中使用
- 它有工具支持。(至少一些简单的编辑器)
- 它具有人类可读的语法(请不要使用尖括号)
此外,我希望它尽可能接近 XML,即必须支持属性和属性。所以,请不要使用 YAML。目前,我想到的只有一种匹配的语言 - JSON。你知道其他的选择吗?
YAML 是 JSON 的 100% 超集,因此拒绝 YAML 然后考虑使用 JSON 是没有意义的。YAML 完成了 JSON 所做的一切,但 YAML 也提供了更多功能(如引用)。
除了使用 DTD 验证文档之外,我想不出任何 XML 可以做 YAML 做不到的事情,根据我的经验,这从来不值得付出这些开销。但是 YAML 比 XML 更快、更容易输入和阅读。
至于属性或属性,如果您考虑一下,它们并没有真正“添加”任何东西......这只是将某些东西写为节点的属性而不是将其放在自己的子节点中的符号快捷方式。但是,如果您喜欢这种便利,您通常可以使用 YAML 的内联列表/哈希来模拟它。例如:
<!-- XML -->
<Director name="Spielberg">
<Movies>
<Movie title="Jaws" year="1975"/>
<Movie title="E.T." year="1982"/>
</Movies>
</Director>
# YAML
Director:
name: Spielberg
Movies:
- Movie: {title: E.T., year: 1975}
- Movie: {title: Jaws, year: 1982}
对我来说,不必为每个节点标签编写两次的奢侈,再加上免于所有尖括号垃圾的自由,使 YAML 成为首选。实际上,我还喜欢缺少正式的标记属性,因为在我看来,这似乎总是 XML 的灰色区域,它不必要地为基本相同的概念引入了两组语法(在编写和遍历时)。YAML 完全消除了这种混淆。
JSON是一个很好的替代方案,并且有多种语言的工具。它在网络客户端中非常容易使用,因为它是原生 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 解析器。Ruby 是一种经常使用 YAML 的语言,它因此出了名的搞砸了。迄今为止我见过的所有 YAML 解析器都是libyaml的副本,它本身是一种手写的(不是从正式描述生成的)类型的解析器,其代码的正确性非常难以验证(函数跨越数百行,控制流复杂)。正如已经提到的,它完全包含 JSON……在少数 Unicode 编码技术之上……在同一个文档中,可能还有一堆你不想听到的其他东西。
另一方面,JSON 与其他两个完全不同。您可以在等待从 Maven Nexus 下载 JSON 解析器工件时编写 JSON 解析器。它可以做的很少,但至少你知道它的能力。没有惊喜。(除了与字符串中的字符转义和双打编码有关的一些差异)。没有隐蔽的利用。你不能在里面写评论。多行字符串看起来很糟糕。无论您所说的属性和属性之间的区别是什么,您都可以通过更多嵌套的字典来实现。
假设,尽管您想纠正 XML 的错误……好吧,那么流行的东西,如 YAML 或 JSON 就不会这样做。不知何故,时尚和理性思维在七十年代中期的某个时候分道扬镳。所以,你必须回到从 McCarthy、Hoare、Codd 和 Kowalski 开始的地方,弄清楚你想要表达的是什么,然后看看对于你是什么来说,最好的表达技术是什么试图代表:)
我发现S-Expressions是表示结构化数据的好方法。这是一种非常简单的格式,易于生成和解析。它不支持属性,但像 YAML 和 JSON 一样,它不需要。属性只是 XML 限制冗长的一种方式。更简单、更清晰的格式只是不需要它们。
你的要求有点不可能。你想要一些接近 XML 的东西,但可能拒绝最接近的没有尖括号 (YAML) 的等价物。
尽管我不喜欢它,为什么不直接使用 XML?您永远不必真正阅读 XML(我想除了调试之外),有大量荒谬的工具可供使用。
几乎所有不是 XML 的东西都不会被广泛使用,因此工具支持会更少。
JSON 可能是等效的,但它几乎同样不可读.. 但同样,您不必实际阅读它(将其加载到您使用的任何语言中,并且应该将其转换为本机数组/字典/变量/任何)。
哦,我确实发现 JSON比XML 更易于解析:我在 Javascript 和 simplejson Python 模块中使用过它 - 关于一个命令,它很好地转换为原生 Python dict 或 Javascript 对象(因此得名!)
AXON涵盖了最好的 XML 和 JSON 。让我们用几个例子来解释一下。
AXON 可以被认为是 XML 数据的较短形式。
XML
<person>
<name>Frank Martin</name>
<age>32</age>
</person>
轴突
person{
name{"Frank Martin"}
age{32}}
或者
person
name:
"Frank Martin"
age:
32
XML
<person name="Frank Martin" age="32" />
轴突
person{name:"Frank Martin" age:32}
或者
person
name: "Frank Martin"
age: 32
AXON 包含某种形式的 JSON。
JSON
{"name":"Frank Martin" "age":32 "birth":"1965-12-24"}
轴突
{name:"Frank Martin" age:32 birth:1965-12-24}
AXON 可以表示类 XML 和类 JSON 数据的组合。
轴突
table {
fields {
("id" "int") ("val1" "double") ("val2" "int") ("val3" "double")
}
rows {
(1 3.2 123 -3.4)
(2 3.5 303 2.4)
(3 2.3 235 -1.2)
}
}
或者
table
fields
("id" "int")
("val1" "double")
("val2" "int")
("val3" "double")
rows
(1 3.2 123 -3.4)
(2 3.5 303 2.4)
(3 2.3 235 -1.2)
现在有可用的 python 库pyaxon。
我会推荐 JSON ......但既然你已经提到它,也许你应该看看Google 协议缓冲区。
编辑:协议缓冲区以编程方式使用(有 c++、java、python 的绑定...),因此它们可能不适合您的目的。
我认为Clearsilver是一个很好的选择。他们甚至在这里有一个比较页面和一个使用它的项目列表
YAML 是功能极其齐全且通常人类可读的格式,但它的致命弱点是复杂性,正如我们今年冬天看到的 Rails 漏洞所证明的那样。由于 Ruby 作为一种配置语言在 Ruby 中无处不在,Github 的 Tom Preston-Werner 加紧创建了一个名为 TOML 的合理替代方案。它立即获得了巨大的吸引力,并具有强大的工具支持。我强烈建议任何查看 YAML 的人检查一下:
对于存储类似代码的数据,LES(Loyc 表达式语法)是一种新兴的替代方案。我注意到很多人将 XML 用于类似代码的构造,例如支持条件、命令调用,有时甚至是循环的构建系统。这些事情在 LES 中看起来很自然:
// LES code has no built-in meaning. This just shows what it looks like.
[DelayedWrite]
Output(
if version > 4.0 {
$ProjectDir/Src/Foo;
} else {
$ProjectDir/Foo;
}
);
不过,它还没有很好的工具支持。目前唯一的 LES 库是用于 C# 的。目前已知只有一个应用程序使用 LES:LLLPG。它支持“属性”,但它们类似于 C# 属性或 Java 注释,而不是 XML 属性。
从理论上讲,您可以将 LES 用于数据或标记,但没有关于如何做到这一点的标准:
body {
'''Click here to use the World's '''
a href="http://google.com" {
strong "most popular"; " search engine!"
};
};
point = (2, -3);
tasteMap = { "lemon" -> sour; "sugar" -> sweet; "grape" -> yummy };
如果您对尖括号过敏,那么 JSON、HDF (ClearSilver) 和OGDL是我唯一知道的。
经过一番谷歌搜索,我还在这里找到了一个替代列表:http:
//web.archive.org/web/20060325012720/www.pault.com/xmlalternatives.html
AFAIK、JSON 和 YAML 在数据结构方面是完全等价的。YAML 只是少了括号和引号之类的东西。所以我看不出你是如何拒绝一个并保留另一个。
此外,我看不出 XML 的尖括号比 JSON 的方括号、大括号和引号更不“可读”。
XML 的替代品确实有很多,但其中许多的主要问题似乎是库可能不适用于每种选择的语言,而且这些库的实现相对困难。
如果与键值对(例如哈希表)相比,解析树结构本身可能并不那么令人愉快。如果一个哈希表实例满足了它的所有键都是字符串并且它的所有值都是字符串的要求,那么实现 hashtable2string() 和 string2hashtable() 就相对不费力了。
我一直在 PHP 和 JavaScript 之间的 AJAX 中使用哈希表序列化以及我开发的格式,称为 ProgFTE(程序员友好文本交换),并在以下位置进行了描述:
http://martin.softf1.com/g/n//a2/doc/progfte/index.html
可以在 Kibuvits Ruby 库中找到 ProgFTE 实现的 Ruby 版本: http ://rubyforge.org/projects/kibuvits/