什么是XML的良好替代数据格式?

时间:2008-09-04 17:15:13

标签: xml serialization data-structures

XML被授予非常有用,但可能非常冗长。有什么替代品,它们是否专门用于任何特定目的?图书馆支持轻松查询内容是一个很大的优点。

25 个答案:

答案 0 :(得分:18)

JSON似乎有很多多平台支持。

答案 1 :(得分:13)

杰夫关于The Angle Bracket Tax的文章总结了许多替代方案(主要是YAML),并引导我进入wiki article on lightweight markup languages

更新:虽然对于某些应用程序来说,YAML可能是“替代XML”,但正如我首先想到的那样,这两者并不是同构的。

确实,它“不是标记语言。”

此外,YAML并不像它看起来那样“轻量级”。对于可以用纯XML表示的文档(例如Jeff的例子),YAML显然不那么冗长。但是YAML提供了许多其他专业结构,比XML保留的字符和序列要多得多。

最重要的是,如果你正在寻找没有角度括号的XML,YAML就不是了。

答案 2 :(得分:9)

不要忘记YAML

JSON似乎有更好的支持。例如,Prototype JS库具有出色的内置JSON函数。

答案 3 :(得分:5)

我不会忽略纯文本,例如CSV或制表符分隔。

答案 4 :(得分:4)

您可以尝试google protobufs。它比XML快得多。它有C,C ++,C#,Java和Python的库(ruby和perl都有alpha版本)。但它是二元的。

答案 5 :(得分:4)

HDF5是一种非常紧凑的数据格式,其某些特性与xml类似。 .net库有很多不足之处,但在大小和性能方面,格式都非常好。

答案 6 :(得分:4)

我使用XML的工作几乎完全是以文档为中心的XML,它必须模拟任意嵌套结构的长序列。我还没有使用JSON,但我的印象是,使用类似文档的数据很麻烦,但是对于类似记录的数据使用时非常适应甚至优雅。在做出决定时,请考虑数据的形状。

答案 7 :(得分:2)

如果您不需要将属性应用于元素,则S-Expressions可以很好地工作。另一种选择是YAML。

答案 8 :(得分:2)

TOML是新的大事。它没有大规格的YAML的优点。它扩展了一种常见且熟悉的配置文件格式。它与JSON直接类似(并且可翻译)。支持所有大语言。由Github联合创始人/总裁汤姆创建,并以自恋的名字命名。这很棒。试一试!

样本TOML:

# This is a TOML document. Boom.

title = "TOML Example"

[owner]
name = "Tom Preston-Werner"
organization = "GitHub"
bio = "GitHub Cofounder & CEO\nLikes tater tots and beer."
dob = 1979-05-27T07:32:00Z # First class dates? Why not?

[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
connection_max = 5000
enabled = true

[servers]

  # You can indent as you please. Tabs or spaces. TOML don't care.
  [servers.alpha]
  ip = "10.0.0.1"
  dc = "eqdc10"

  [servers.beta]
  ip = "10.0.0.2"
  dc = "eqdc10"

[clients]
data = [ ["gamma", "delta"], [1, 2] ]

# Line breaks are OK when inside arrays
hosts = [
  "alpha",
  "omega"
]

答案 9 :(得分:2)

XML通常用于配置,在这种情况下,还有一些其他简单的存储格式经常使用(较少面向文档):

  1. .property files
  2. INI files
  3. 根据平台和语言的不同,有各种读写方式。

答案 10 :(得分:2)

您想对数据做什么?存放吗?传递它?显示它?这些问题应该促使您寻找合适的技术。简单地询问您应该如何格式化数据就像询问您应该编写什么语言,而不指定您想要完成的内容。

对于大多数数据任务,Codd博士都有治愈方法:http://en.wikipedia.org/wiki/Edgar_F._Codd。数据库应该能够做任何你想到的事情。

如果你传递它,我提倡纯文本。滚动自己的二进制格式时,当解析器消失时,数据会消失。

使用纯文本,更深层次的问题是放置元数据的位置。它应该在数据文件外部还是内部(“自我描述”)。

例如,XML是纯文本,但源代码也是如此。对于源文件,有一个规范详细介绍了语法和语义,而XML 假设是自描述的。问题是它不是。此外,它直接从文档表示和标记发展而来,但现在被滥用于各种数据序列化,传输和存储。

答案 11 :(得分:1)

但成本是多少?

我在很多情况下都是JSON,特别是在需要考虑权重或客户端工作的情况下,但是远离XML会失去可读性(在这些配置文件中非常重要)以及明天的问题解决方案(如XSLT和XPath的。要确定为什么以及什么时候离开:这是事实上的标准。

(除此之外:我的习惯是在内部使用XML,并将其转换为JSON,这是所需的输出)

答案 12 :(得分:1)

对于常见任务(如序列化和配置),

Simple Declarative Language是XML的不错替代品。它提供了一个C#和Java解析器库。我认为它擅长于在没有XML冗长的情况下指定所有类型的元数据。

答案 13 :(得分:1)

异端! XML是数据之王。 对篡夺者说不,用他们的头! XML万岁!

但严重的是,如果只需要数据使用Json,支持和优雅,但如果你需要格式化,xpath像查询,额外的元数据等...坚持使用XML

注意:我使用Xml进行配置系统构建代码生成和类似任务,但是Json用于Rpc,Sql用于查询和持久性,最后Yaml用于记录和快速任务,换句话说,选择适用的格式为需要。

答案 14 :(得分:1)

  

我不会忽略纯文本,例如CSV或制表符分隔。

我真的在寻找具有定义结构和(跨平台,多语言)库支持的替代方案。我有兴趣看看不同的设计及其优缺点。我喜欢可以有文本和“二进制”(紧凑,“编译”,快速I / O,更小的占用空间)格式的格式的想法。拥有库的优势在于它们可以为您执行解析以及可能的额外数据操作/验证。

虽然已经说过,但肯定会使用简单的格式,如.ini,.plist和CSV等。你不应该总是用锤子来破解坚果。

答案 15 :(得分:1)

JSON is valid YAML这可能非常有用。二合一!

答案 16 :(得分:1)

为了完整起见,我将在很久以前提到我为其编写接口的Edifact

答案 17 :(得分:0)

如果您从DSL的角度提问,Guile Scheme可以提供帮助,正如S表达式所建议的那样。

我个人也使用JSON进行AJAX交易。

答案 18 :(得分:0)

XML可以用于文本标记,但对于一般结构,序列化是一个非常糟糕的选择,其中JSON更适合。

答案 19 :(得分:0)

你喜欢什么,只要它不是ASN.1

答案 20 :(得分:0)

JSON可以在很多方面使用,但它特别适合与我找到的MySQL表一起使用。它也适用于Android(GSON库或JSON)。除此之外,它可以单独或作为阵列传输少量数据。

答案 21 :(得分:0)

我刚刚完成了序列化格式的开发,可以应用于存储和传输树形结构数据。关于我的工作最重要的方面是所提供的技术减少了尽可能多的开销 - 序列化和反序列化。我还尝试尽可能简化实现,以便在一天之内自己实现它不应该是一个问题。如果您有兴趣,可以前往http://issuu.com/daniilm/docs/trifle我放置规范的地方。一切都是免费的,有许多有用的图表。

答案 22 :(得分:0)

对于存储类似代码的数据,LES(Loyc Expression Syntax)是一种新兴的替代方案。我注意到很多人将XML用于类似代码的构造,例如支持条件,命令调用,有时甚至是循环的构建系统。在LES中,这些事物看起来很自然:

// LES code has no built-in meaning. This just shows what it looks like.
[DelayedWrite] // an "attribute"
Output(
    if version > 4.0 {
        $ProjectDir/Src/Foo;
    } else {
        $ProjectDir/Foo;
    }
);

但它还没有很好的工具支持;目前唯一的LES库是C#。目前,只有一个应用程序可以使用LES:LLLPG

理论上你可以使用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 };

答案 23 :(得分:0)

为了提及...看看我的建议:

http://igagis.github.io/stob/

它非常简单,并且没有多种特殊符号的重载,只有{}和""基本上

支持C ++风格的评论。

有C ++,C#和Java库。

示例:

"String object"
AnotherStringObject
"String with children"{
    "child 1"
    Child2
    "child three"{
        SubChild1
        "Subchild two"

        Property1 {Value1}
        "Property two" {"Value 2"}
        //comment

        /* multi-line
           comment */

        "multi-line
         string"

        "Escape sequences \" \n \r \t \\"
    }
}

答案 24 :(得分:0)

如果有人看起来不那么冗长的替代XML,这或多或少与XML同构,那么就有AXON。为了解释在XML和AXON中考虑等效表示的示例。还有支持AXON格式的python库pyaxon

XML

<person>
   <name>Alex</name>
   <age>34</age>
   <email>mail@example.com</email>
</person>

AXON

person {
  name {"Alex"}
  age {34}
  email {"mail@example.com"}}

XML

<memo date="2008-02-14">
<from>
<name>The Whole World</name><email>us@world.org</email>
</from>
<to>
<name>Dawg</name><email>dawg158@aol.com</email>
</to>
<message>
Dear sir, you won the internet. http://is.gd/fh0
</message>
</memo>

AXON

memo {
  date:2008-02-14
  from {
    name{"The Whole World"} email{"us@world.org"}}
  to {
    name{"Dawg"} email{"dawg158@aol.com"}}
  message {"Dear sir, you won the internet. http://is.gd/fh0"}
}

XML

<club>
  <players>
    <player id="kramnik"
       name="Vladimir Kramnik"
       rating="2700"
       status="GM" />
    <player id="fritz"
       name="Deep Fritz"
       rating="2700"
       status="Computer" />
    <player id="mertz"
      name="David Mertz"
      rating="1400"
      status="Amateur" />
  </players>
  <matches>
    <match>
      <Date>2002-10-04</Date>
      <White refid="fritz" />
      <Black refid="kramnik" />
      <Result>Draw</Result>
    </match>
    <match>
      <Date>2002-10-06</Date>
      <White refid="kramnik" />
      <Black refid="fritz" />
      <Result>White</Result>
    </match>
  </matches>
</club>

AXON

club {
  players {
    player {
      id:"kramnik"
      name:"Vladimir Kramnik"
      rating:2700
      status:"GM"}
    player {
      id:"fritz"
      name:"Deep Fritz"
      rating:2700
      status:"Computer"}
    player {
      id:"mertz"
      name:"David Mertz"
      rating:1400 
      status:"Amateur"}}
  matches {
    match {
     Date{2002-10-04}
     White{refid:"fritz"}
     Black{refid:"kramnik"}
     Result{"Draw"}}
    match {
      Date{2002-10-06}
      White{refid:"kramnik"}
      Black{refid:"fritz"}
      Result{"White"}}}}