XML的弱点是什么? [关闭
-
01-10-2019 - |
题
阅读Joel Spolsky和Jeff Atwood的Stackoverflow并聆听播客,我开始相信许多开发人员讨厌使用XML或至少使用 尝试避免尽可能多地使用XML来存储或交换数据.
另一方面,我非常喜欢使用XML,原因有几个:
- XML序列化以大多数现代语言实现,并且是 非常易于使用,
- 比二进制序列化慢,XML序列化非常有用 使用来自几种编程语言的相同数据 或者打算阅读和理解的地方,即使是由人类调试(例如,JSON)更难理解),
- XML支持 Unicode, ,当正确使用时,不同的编码,字符等都没有问题。
- 有很多工具可以轻松使用XML数据。 XSLT 就是一个例子,使其易于显示和转换数据。 XPATH 是另一个,使搜索数据很容易,
- XML可以存储在某些SQL服务器中,该服务器可以启用数据时的方案 太复杂了,无法轻松存储在SQL表中 必须保存和操纵;例如,JSON或二进制数据不能直接通过SQL来操纵(通过操纵字符串,这在大多数情况下是疯狂的),
- XML不需要安装任何应用程序。如果我希望我的应用使用数据库,则必须先安装数据库服务器。如果我希望我的应用使用XML, 我不必安装任何东西,
- XML更多 显式和可扩展 例如,Windows注册表或INI文件,
- 在大多数情况下,有 没有CR-LF问题, ,感谢XML提供的抽象水平。
因此,考虑到使用XML的所有好处,为什么如此多的开发人员讨厌使用它?恕我直言,唯一的问题是:
- XML太冗 并且比大多数其他形式的数据需要更多的位置,尤其是在base64编码方面。
当然,在许多情况下,XML根本不适合。将问题和答案存储在XML文件中 在服务器端 绝对是错误的。或者,当存储AVI视频或一堆JPG图像时,XML是最糟糕的事情。
但是其他场景呢? XML的弱点是什么?
对于那些认为这个问题不是真正问题的人:
与未关闭的问题相反 自1980年以来,计算的重要新发明, , 我的问题 是 一个非常清晰的问题,并清楚地邀请解释其他人使用XML时所经历的弱点以及为什么他们不喜欢它。它不邀请讨论,例如 如果XML是好是坏. 。它也不需要扩展讨论;因此,到目前为止收到的当前答案是简短而精确的,并提供了我想要的足够信息。
但 这是一个Wiki,因为没有 独特 这个问题的好答案。
根据这样,“不是真正的问题”是一个问题 “很难说出这里的要求。这个问题是模棱两可,模糊,不完整或修辞的,无法以当前形式合理地回答。”
- 这里问什么: :我认为问题本身非常清楚,上面的几段文本使它变得更加清晰,
- 这个问题是模棱两可,含糊,不完整的: :同样,没有什么歧义,既不含糊也不完整,
- 或修辞: :不是:我问题的答案不是明显的,
- 并且不能合理地回答: :几个人已经对这个问题给出了很好的答案,表明该问题可以合理地回答。
如何评价答案并确定公认的答案似乎也很明显。如果答案给出了XML出了问题的充分理由,那么有可能将此答案投票,然后被接受。
解决方案
一些弱点:
- 将XML文件和外部资源关联起来有些困难,这就是为什么新的Office文档格式使用包含骨架XML文件和捆绑在一起的资源文件的ZIP信封的原因。使用base64编码的另一个选项是非常详细的,不允许随机访问,这使一个要点是:
- 随机访问很困难。读取XML文件的两种传统模式都没有 - 构造DOM或仅向前的SAX样式阅读允许真正的随机访问。
- 同时写对文件不同部分的写入访问很困难,这就是为什么它在Windows可执行清单中使用的原因是错误的。
- XML文件使用什么编码?严格来说,您首先猜测编码,然后读取文件并验证编码正确。
- 很难版本的文件部分。因此,如果您想提供颗粒状版本,则需要拆分数据。这不仅是文件格式问题,而且还因为工具通常提供每文件的语义 - 版本控制工具,诸如Dropbox之类的同步工具等。
其他提示
<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>
我不是合适的人,因为我本人是XML的忠实拥护者。但是,我可以告诉您我听到的主要投诉之一:
这是 难的 跟...共事。在这里,硬意味着要知道API,并且您需要编写相对较大的代码来解析XML。虽然我不会说这确实很难,但我只能同意,当使用支持动态创建对象的语言时,可以更轻松地访问一种描述对象的语言。
我认为总体而言,这种反应仅仅是因为XML被过度使用。
但是,如果我讨厌XML的一个词,那么激情就是名称空间。围绕名称空间问题的生产力损失是可怕的。
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)。
与所有事物一样,正确的工作工具是遵循的最佳规则。
我最喜欢的讨厌问题是使用XML属性的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建议的属性订购并不重要,而男孩是您受伤的世界。