您知道什么可用的XML语法替代方法?

时间:2008-09-09 09:54:41

标签: xml syntax yaml

对我而言可用表示:

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

此外,我希望它尽可能接近XML,即必须支持属性和属性。所以,请不要YAML。目前,我只想到一种匹配的语言 - JSON。你知道其他任何选择吗?

14 个答案:

答案 0 :(得分:49)

YAML是JSON的100%超集,因此拒绝YAML然后再考虑JSON是没有意义的。 YAML完成了JSON所做的一切,但是YAML也提供了更多功能(如引用)。

我无法想到除了使用DTD验证文档之外,XML无法做到的任何事情,根据我的经验,从来没有值得开销。但是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完全消除了这种困惑。

答案 1 :(得分:13)

JSON是一个非常好的选择,并且有多种语言的工具。它在Web客户端中使用起来非常简单,因为它是本机javascript。

答案 2 :(得分:6)

我发现S-Expressions是表示结构化数据的好方法。这是一种非常简单的格式,易于生成和解析。它不支持属性,但是像YAML&amp; JSON,它不需要。属性只是XML限制冗长的一种方式。更简单,更清晰的格式就是不需要它们。

答案 3 :(得分:6)

TL; DR

这里没有提到Prolog,但它是我所知道的表示数据的最佳格式。 Prolog程序本质上描述了实体之间复杂关系的数据库。 Prolog很难解析,其中可能只有竞争对手是该领域的S表达式。

完整版

程序员经常忘记&#34; XML实际上由什么组成。通常指的是它的一小部分。 XML是一种非常复杂的格式,至少包含以下部分:DTD schema languageXSD schema languageXSLT transformation languageRNG schema languageXPath(以及XQuery)语言 - 它们都是是XML标准的重要组成部分。另外,还有像E4X这样的伪经。它们中的每一个都有自己的版本,相当多的重叠,不兼容等。很少有XML解析器实现所有这些。更不用说流行解析的多个怪癖和错误,有些会导致明显的安全问题,如https://en.wikipedia.org/wiki/XML_external_entity_attack

因此,寻找XML 替代并不是一个好主意。你可能根本不想处理类似的XML。

YAML可能是第二差的选择。它没有XML那么大,但它的设计也是为了覆盖所有基础...每次超过十次......以不同的,独特的方式,没人能想到。我还没有听说过正常工作的YAML解析器。 Ruby,使用YAML的语言很多,因为它而着名screwed up。我迄今见过的所有YAML解析器都是libyaml的副本,它本身是手写的(不是从正式描述生成的)解析器类型,其代码很难验证正确性(具有复杂控制流的数百行的功能)。正如已经提到的,它完全包含JSON ...除了少数Unicode编码技术之外......在同一个文档中,可能还有一些你不想听到的其他东西。< / p> 另一方面,JSON与其他两个完全不同。您可以在等待从Maven Nexus下载JSON解析器artefact时编写JSON解析器。它可以做很少,但至少你知道它的能力。没有惊喜。 (除了与字符串和双精度编码中的字符转义相关的一些差异)。没有隐蔽的攻击。你不能在其中写评论。多行字符串看起来很糟糕。无论你通过区分属性和属性来表达什么,都可以通过更多嵌套字典来实现。

假设,虽然你想要正确的XML冤枉...好吧,那么像YAML或JSON这样的流行的东西都不会这样做。时尚和理性思维在七十年代中期的某些时间分道扬..所以,你必须回到McCarthy,Hoare,Codd和Kowalski开始的所有地方,弄清楚你想要代表什么,然后看看有什么最好的代表技术无论你想表达的是什么:)

答案 4 :(得分:5)

杰夫写了关于这个herehere的文章。这应该可以帮助你开始。

答案 5 :(得分:3)

我会推荐JSON ......但既然你已经提到过它,那么你应该看看Google protocol buffers

编辑:协议缓冲区以编程方式使用(有c ++,java,python ...的绑定),因此它们可能不适合您的目的。

答案 6 :(得分:3)

你的要求有点不可能..你想要一些接近XML的东西,但拒绝可能是没有角括号(YAML)的最接近的等价物。

尽管我不喜欢它,但为什么不使用XML呢?你不应该真正阅读XML(除了调试之外,我想),有一些荒谬的工具。

几乎任何不是XML的东西都不会被广泛使用,因此工具支持会减少。

JSON可能大致相当,但它几乎同样不可读......但同样,你不应该真正阅读它(将它加载到你正在使用的任何语言中,它应该转换为原生数组/ dicts /变量/不管)。

哦,我确实发现JSON 比XML更好解析:我在Javascript和simplejson Python模块中使用它 - 关于一个命令,它很好地转换为本机Python dict,或Javascript对象(因此名称!)

答案 7 :(得分:3)

AXON涵盖了最好的XML和JSON。让我们在几个例子中解释一下。

AXON可被视为较短形式的XML数据。

XML

<person>
   <name>Frank Martin</name>
   <age>32</age>
 </person>

AXON

person{
  name{"Frank Martin"}
  age{32}}

person
  name:
    "Frank Martin"
  age:
    32

XML

<person name="Frank Martin" age="32" />

AXON

person{name:"Frank Martin" age:32}

person
  name: "Frank Martin"
  age: 32

AXON包含某种形式的JSON。

JSON

{"name":"Frank Martin" "age":32 "birth":"1965-12-24"}

AXON

{name:"Frank Martin" age:32 birth:1965-12-24}

AXON可以表示类似XML和类似JSON的数据的组合。

AXON

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

答案 8 :(得分:2)

我认为Clearsilver是一个非常好的选择。他们甚至有一个比较页面here和一个使用它的projects列表

答案 9 :(得分:2)

对于存储类似代码的数据,LES(Loyc Expression Syntax)是一种新兴的替代方案。我注意到很多人将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 };

答案 10 :(得分:1)

如果你对尖括号过敏,那么JSON,HDF(ClearSilver)和OGDL是我唯一知道的。

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

答案 11 :(得分:1)

YAML功能非常全面且通常是人类可读的格式,但是我们在今年冬天看到的Rails漏洞就证明了它的复杂性是阿基里斯的痊愈。由于它作为配置语言在Ruby中无处不在,因此Github成名的Tom Preston-Werner加强了创建一个被称为TOML的理智替代品。它立即获得了巨大的吸引力并拥有出色的工具支持我强烈推荐任何看YAML的人查看它:

https://github.com/mojombo/toml

答案 12 :(得分:0)

AFAIK,JSON和YAML在数据结构方面完全相同。 YAML只有较少的括号和引号和东西。所以我不知道你是如何拒绝一个并保留另一个。

另外,我没有看到XML的尖括号比JSON的方括号,大括号和引号更不像“人类可读”。

答案 13 :(得分:0)

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/