阅读StackOverflow并听Joel Spolsky和Jeff Atwood的播客,我开始相信许多开发人员讨厌使用XML或至少尽量避免使用XML来尽可能地存储或交换数据
另一方面,我喜欢使用XML有很多原因:
因此,考虑到使用XML的所有好处,为什么这么多开发人员讨厌使用它?恕我直言,唯一的问题是:
当然,有很多情况下XML根本不适合。在服务器端的XML文件中存储SO的问题和答案将是绝对错误的。或者,当存储AVI视频或一堆JPG图像时,XML是最糟糕的事情。
但其他情况呢? XML有哪些缺点?
对于那些认为这个问题不是真正问题的人:
与非关闭Significant new inventions in computing since 1980之类的问题相反,我的问题 是一个非常明确的问题,并且明确地邀请解释其他人在使用XML时遇到的弱点以及他们为什么不喜欢它。例如,如果XML是好的还是坏的,它不会邀请讨论。它也不需要进行长时间的讨论;因此,目前收到的答案简短而准确,并提供了我想要的足够信息。
但是它是一个wiki,因为这个问题没有唯一的好答案。
根据SO,“不是一个真正的问题”是一个问题,其中“很难说出这里要问的是什么。这个问题含糊不清,模糊不清,不完整或修辞,目前无法合理回答形式“。
如何评估答案并确定接受的答案似乎也很明显。如果答案给出了XML错误的充分理由,那么这个答案很可能会被投票,然后被接受。
答案 0 :(得分:6)
<xml>
<noise>
The
</noise>
<adjective>
main
</adjective>
<noun>
weakness
</noun>
<noise>
of
</noise>
<subject>
XML
</subject>
<noise>
,
</noise>
<whocares>
in my opinion
</whocares>
<noise>
,
</noise>
<wildgeneralisation>
is its verbosity
</wildgeneralisation>
<noise>
.
</noise>
</xml>
答案 1 :(得分:5)
一些弱点:
答案 2 :(得分:1)
我不是合适的人,因为我自己是xml的粉丝。但是,我可以告诉你一个我听过的主要抱怨:
很难使用。在这里,硬意味着它需要知道一个API,你需要编写相对多的代码来解析你的xml。虽然我不会说它真的那么难,但我只能同意在使用支持动态创建对象的语言时,可以更容易地访问用于描述对象的语言。
答案 3 :(得分:1)
我认为一般来说,反应仅仅是因为XML过度使用。
然而,如果有一个词,我讨厌XML,充满激情,就是命名空间。命名空间问题的生产力损失是可怕的。
答案 4 :(得分:1)
XML来自SGML,它是标记语言的曾祖父。 SGML和扩展XML的目的是注释文本。 XML做得很好,并且有各种各样的工具可以增加其在各种应用程序中的工具。
正如我所看到的,问题是XML经常被使用,而不是注释文本,而是表示结构化数据,这是一个微妙但重要的区别。实际上,结构化数据需要简明扼要,原因有很多。性能是显而易见的,特别是在带宽有限的情况下。这可能是JSON在Web应用程序中如此受欢迎的主要原因之一。线上简洁的数据结构表示意味着更好的可扩展性。
不幸的是,如果没有额外的空白填充,JSON就不会很容易读取,这几乎总是被省略。另一方面,如果您曾尝试使用命令行编辑器编辑大型XML文件,那么它也可能非常笨拙。
就个人而言,我发现YAML在两个极端之间取得了很好的平衡。比较以下内容(从 yaml.org 复制并进行微小更改)。
YAML:
invoice: 34843
date: 2001-01-23
billto: &id001
given: Chris
family: Dumars
address:
lines: |
458 Walkman Dr.
Suite #292
city: Royal Oak
state: MI
postal: 48046
shipto: *id001
product:
- sku: BL394D
quantity: 4
description: Basketball
price: 450.00
- sku: BL4438H
quantity: 1
description: Super Hoop
price: 2392.00
tax : 251.42
total: 4443.52
comments: >
Late afternoon is best.
Backup contact is Nancy
Billsmer @ 338-4338.
XML:
<invoice>
<number>34843</number>
<date>2001-01-03</date>
<billto id="id001">
<given>Chris</given>
<family>Dumars</family>
<address>
<lines>
458 Walkman Dr.
Suite #292
</lines>
<city>Royal Oak</city>
<state>MI</state>
<postal>48046</postal>
</address>
</billto>
<shipto xref="id001" />
<products>
<product>
<sku>BL394D</sku>
<quantity>4</quantity>
<description>Basketball</description>
<price>450.00</price>
</product>
<product>
<sku>BL4438</sku>
<quantity>1</quantity>
<description>Super Hoop</description>
<price>2392.00</price>
</product>
</products>
<tax>251.42</tax>
<total>4443.52</total>
<comments>
Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338
</comments>
</invoice>
它们都代表相同的数据,但YAML小于30%且可读性更高。您希望用文本编辑器修改哪个?有许多库可用于解析和发出YAML(即Java开发人员的snakeyaml)。
与所有事情一样,正确工作的正确工具是最好的规则。
答案 5 :(得分:0)
我最喜欢的问题是使用属性的XML序列化格式 - 比如XAML。
这有效:
<ListBox ItemsSource="{Binding Items}" SelectedItem="{Binding CurrentSelection}"/>
这不是:
<ListBox SelectedItem="{Binding CurrentSelection}" ItemsSource="{Binding Items}"/>
XAML反序列化在从XML流中读取属性值时指定它们。因此,在第二个示例中,当分配SelectedItem
属性时,控件的ItemsSource
尚未设置,并且SelectedItem
属性正被分配给尚未知道的项目。
如果您使用Visual Studio创建XAML文件,一切都会很酷,因为Visual Studio维护属性的顺序。但是在一些XML工具中修改你的XAML,当它说属性的排序不重要时,相信XML推荐,而男孩你是在一个受伤的世界。