为我 可用的 意思是:

  • 它正在现实世界中使用
  • 它有工具支持。(至少有一些简单的编辑器)
  • 它具有人类可读的语法(请不要使用尖括号)

我还希望它尽可能接近 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 是一个非常好的选择,并且有多种语言的工具。而且它在 Web 客户端中使用起来非常简单,因为它是原生 JavaScript。

我已经发现 S-表达式 成为表示结构化数据的好方法。这是一种非常简单的格式,易于生成和解析。它不支持属性,但像 YAML 和 JSON 一样,它不需要。属性只是 XML 限制冗长的一种方式。更简单、更干净的格式只是不需要它们。

长话短说

这里没有提到 Prolog,但它是我所知道的表示数据的最佳格式。Prolog 程序本质上描述数据库,实体之间具有复杂的关系。Prolog 解析起来非常简单,它唯一的竞争对手可能是这个领域的 S 表达式。

完整版

程序员常常“忘记”XML 实际由什么组成。通常指的是它的一个很小的子集。XML 是一种非常复杂的格式,至少包含以下部分: DTD 模式语言, XSD 模式语言, XSLT 转换语言, RNG 模式语言X路径 (加上 XQuery)语言 - 它们都是 XML 标准的重要组成部分。另外,还有一些伪经,比如 E4X. 。他们每个人都有自己的版本,有相当多的重叠、不兼容等。很少有 XML 解析器能够实现所有这些功能。更不用说流行解析的多个怪癖和错误,其中一些会导致显着的安全问题,例如 https://en.wikipedia.org/wiki/XML_external_entity_attack .

因此,寻找 XML 选择 这不是一个好主意。您可能根本不想处理 XML 之类的东西。

YAML 可能是第二差的选择。它不像 XML 那么大,但它的设计也是为了尝试覆盖所有基础......每次都超过十次...以任何人都无法想象的不同且独特的方式。我还没有听说过可以正常工作的 YAML 解析器。Ruby 是一种大量使用 YAML 的语言,它以 搞砸了 因为它。迄今为止我见过的所有 YAML 解析器都是以下副本 利比亚, ,它本身是一种手写的(不是从正式描述生成的)解析器,其代码很难验证其正确性(函数跨越数百行,控制流复杂)。正如已经提到的,它完全包含 JSON...基于一些 Unicode 编码技术......在同一个文档中,可能还有一堆您不想听到的其他内容。

另一方面,JSON 与其他两者完全不同。您可以在等待从 Maven Nexus 下载 JSON 解析器工件时编写一个 JSON 解析器。它能做的事情很少,但至少你知道它的能力。没有什么惊喜。(除了与字符串和双精度编码中的字符转义相关的一些差异)。没有秘密的利用。您不能在其中写评论。多行字符串看起来很糟糕。无论您所说的属性和属性之间的区别是什么意思,您都可以通过更多嵌套的字典来实现。

假设,尽管您想纠正 XML 所犯的错误......好吧,那么像 YAML 或 JSON 这样流行的东西就无法做到这一点。不知何故,时尚和理性思维在七十年代中期的某个时候在编程中分道扬镳。所以,你必须回到一切从麦卡锡、霍尔、科德和科瓦尔斯基开始的地方,弄清楚你想要代表什么,然后看看什么是最好的代表技术,无论你是什么试图代表:)

杰夫写过这个 这里这里. 。这应该可以帮助您入门。

我会推荐 JSON ...但既然你已经提到了,也许你应该看看 谷歌协议缓冲区.

编辑:Protocol buffers 被设计为以编程方式使用(有 c++、java、python ...的绑定),因此它们可能不适合您的目的。

你的要求有点不可能..您想要接近 XML 的内容,但可能会拒绝不带尖括号 (YAML) 的最接近的等效内容。

尽管我非常不喜欢它,但为什么不直接使用 XML 呢?您不必真正阅读 XML(我想除了调试之外),有大量的工具可以用于它。

几乎所有非 XML 的内容都不会得到广泛使用,因此工具支持也会减少。

JSON 可能差不多,但它几乎同样不可读。但同样,您不必真正阅读它(将其加载到您正在使用的任何语言中,并且应该将其转换为本机数组/字典/变量/任何内容)。

哦,我确实找到了 JSON 远的 比 XML 更好解析:我在 Javascript 和 simplejson Python 模块中使用过它 - 大约一个命令,它很好地转换为本地 Python 字典,或 Javascript 对象(因此得名!)

轴突 涵盖了 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 库 皮亚克松 现在。

我认为 透明银 是一个非常好的选择。他们甚至还有一个比较页面 这里 和一个列表 项目 使用它的

用于存储类似代码的数据, 莱斯 (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: LLPG. 。它支持“属性”,但它们就像 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, 高密度纤维束 (透明银),以及 OGDL 是我唯一认识的人。

经过一番谷歌搜索后,我还在这里找到了替代方案列表:
http://web.archive.org/web/20060325012720/www.pault.com/xmlalternatives.html

YAML 是一种功能极其齐全且通常是人类可读的格式,但它的致命弱点是复杂性,正如我们今年冬天看到的 Rails 漏洞所证明的那样。由于 Ruby 作为一种配置语言无处不在,Github 出名的 Tom Preston-Werner 开始创建一个名为 TOML 的明智替代方案。它立即获得了巨大的关注并拥有强大的工具支持。我强烈建议任何查看 YAML 的人都检查一下:

https://github.com/mojombo/toml

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/

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top