XML被授予非常有用,但可能非常冗长。有什么替代品,它们是否专门用于任何特定目的?图书馆支持轻松查询内容是一个很大的优点。
答案 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通常用于配置,在这种情况下,还有一些其他简单的存储格式经常使用(较少面向文档):
根据平台和语言的不同,有各种读写方式。
答案 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)
为了提及...看看我的建议:
它非常简单,并且没有多种特殊符号的重载,只有{}和""基本上
支持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"}}}}