如果XML太糟糕了……为什么会有那么多人使用它?[关闭]


37

我了解XML的目的,但是我总是听到人们抱怨它的错误程度如何?我真的不明白这有什么不好的吗?我通常会听到“ blo肿”和“慢速”这两个词。

但是我想作为程序员,您主要将其用于什么?而且您真的认为它“不好”吗?...因为确实如此,所以很多人都用它来传输数据...


1
您的答案在问题中。人们之所以仍然使用它是因为人们曾经使用过它,而选项是(1)在JSON和YAML之前重写所有使用过它的代码,或者(2)吸收它并做愚蠢的事情。许多人仍然使暴力循环永存。那并不能证明这种做法的内在价值。
Parthian Shot 2015年

5
尝试使用JSON获取实际文档(手册页,Knuth,Hamlet等)。然后,您将了解为什么XML是必不可少的。这是JSON很烂的空间(继续尝试)。在另一个人的设计空间中使用一个是可疑的。在JSON的空间中使用XML的问题主要是冗长和速度,而在XML的空间中使用JSON的问题往往涉及可移植性(尝试与使用JSON编写书籍的朋友进行互操作,但以他们自己的方式进行),完整性和解释问题,需要大量人力来解决。使用适合您工作的工具。
TextGeek

XML的坏处在于,因为许多人滥用它的目的并非出于设计目的。如果您不需要数据易于扩展(即该方案由需要互操作的多方使用,而不是由一个权威方集中指示),并且您的数据不是文档(即DOM是否会(对数据的抽象性很差),那么XML不适合这些应用程序。当您的问题域落在XML的设计目标之内时,没有其他匹配XML。JSON,YAML等不适合XML真正设计的空间。
Lie Ryan

Answers:


90

Xml非常适合其设计初衷-平台中立的,人类可读的数据传输协议,具有一些功能,可以在较低级别上强制执行数据验证。我怀疑以这种方式使用Xml的人是否会有真正的抱怨。它是最简洁的线格式吗?不,但是还有更糟糕的选择。它和读取自定义二进制格式一样快吗?不会。但是您的业务合作伙伴可以使用任何堆栈读取它。

然而,问题在于人类-尤其是被称为企业建筑师的人-是邪恶的,会接受好东西并使他们变得不好。以Xml为例,在本世纪初,Xml被视为解决每个IT问题的通用工具。通过委员会进行一些小的设计,最终会导致一些可怕的怪事,例如SOAP和oXML。敌人,没关系的朋友或同事都不希望这样做。


15
+1-曾经不得不处理EDI的任何人都只是希望XML在那一团糟之前就被发明出来了。
Scott Whitlock

12
+1几乎完全符合我的想法。我只添加了用于存储普通数据和简单数据的方法,即使它是分层结构(但不是太深,也无法与任何东西很好地融合),某些格式也可以很好地工作-最著名的是JSON和YAML。就人类可读性而言,后者真是太棒了。

11
用jwz来解释:“有某种程序员会研究任何问题,然后说:'我知道,我将使用XML。' 现在他有两个问题。”
亚当·克罗斯兰

13
请告诉我,oXML只是一个玩笑,例如Br​​ainfuck或Whitespace或LOLCODE。
dsimcha 2011年

9
@Shamim Hafiz,SOAP绝对是人类有史以来最糟糕的怪兽之一。
SK-logic

24

XML只是具有多种口味和用途的工具。XML在某些方面很擅长,而另一些方面则很烂。我认为问题之一是,人们已经看到“企业” XML不必要地复杂化了名称空间和乱七八糟的东西(SOAP,有人吗?)。为人类设计XML格式的诀窍是为数据添加真实含义,同时又不至于使它们难以阅读。

人们所质疑的一件事是,XML有时会在某些字符或某些缺少的括号中引起阻塞。但是,这既有上行也有下行。好处是,您不会像使用HTML那样具有歧义性,在HTML中,对半无效语法的不同情况可以有不同的解释。

缺点是,编写和学习起来有点困难。我同意有一个论点是,如果HTML像XML一样严格,那么网络就不会发展得如此之快,但是我也认为如果今天这样做我们会感到高兴。:)

另外,不要仅仅因为可以,有理智和判断力适当地使用它就将它用于所有事情。如果您拥有的只是XML,那么您往往总是远离所需的XSLT转换。:)

我认为格式仅在人类需要与之交互时才真正重要。如果您正在编写一些序列化某些程序并将其发送到另一个程序要使用的程序的地方,那么谁会在乎它的外观,只要它尽可能高效即可?对于我所关心的全部使用二进制格式或兔子和独角兽。

XML的优点

  • 涵盖了很多YAML和JSON不具备的优势
  • 有出色的工具可以解析和验证各种不同平台和语言的XML
  • XML可以轻松强大地转换为另一种格式(通过XSLT之类的东西)
  • 合理的XML文档对于人类来说很容易阅读和编辑。不要告诉我JSON更容易,不是:)
  • XML在某种程度上是自我描述的,即,它直接包含有关其结构和含义的信息(与大多数二进制格式相反)
  • 处理编码
  • 与空白无关,这使得跨平台使用更加容易
  • 如果格式不正确则中断(确保数据在结构上正确)
  • 不是SGML

缺点

  • 详细
  • 解析速度不如二进制文件快
  • 如果格式不正确则中断(破坏您的应用程序)

很好的用途

  • 配置文件
  • 数据交换格式
  • 版本弹性文件格式
  • 将文档存储在数据库中

不太好用

  • 数据传输格式
  • 序列化对象
  • 在数据库中存储关系数据
  • 高性能I / O方案的文件格式

13
我怀疑“配置文件”是否应处于“良好使用”之下。它们不是数据,而是指令。
daknøk

3
我在这里与@daknøk在一起-我无法计算我不得不花费大量时间找出几行行长的XML文件中的配置错误,该XML文件指定了依赖项注入,这是基于XML属性。
加拉尔

3
如果坏数据使应用程序崩溃,那么数据是否有问题?
James Snell 2013年

4
格式错误/损坏的任何文件格式都有可能使损坏的软件崩溃。因此,XML不是这里的罪魁祸首...仅仅是您的应用程序。否则,好的帖子。
Thomas Eding 2014年

3
您是否可以扩展“涵盖很多YAML和JSON不能提供的优势案例”?
Trevor Hickey

14

Jeff Atwood在XML上有一篇非常不错的博客文章如果您想让消息来源谈论这个问题,可以用Angle Bracket Tax来解决。

我最常用的用途是:

  • 服务互相交谈。例如,使用内容管理系统的网站必须将一些数据发送到客户关系管理系统中,而这是通过XML完成的。

  • 配置存储。Web.config和app.config是常见示例,但是nAnt脚本也可以对它们使用一些XML。

我认为这不是最佳选择,但仅此一项就不会令我感到失望。


11

两个原因:

  1. 那里有很多糟糕的程序员。XML可能很糟糕,但是它也很简单(至少从表面上看),并且使编写不好的软件非常容易。有点像VB。
  2. 做出这些决定的很多人都不是程序员,而是只听说过“每个人都在使用XML”的业务类型,因此他们决定也希望他们的产品也使用XML。

荒谬而又完全无用的观点。1)XML远非劣质,并且与人们是否选择它的软件质量完全无关,我见过相当不错的VB程序员,这意味着如果您使用VB,实际上编写的是劣质软件。只是愚蠢,因为在您编写软件的方式与编写软件的方式之间存在着完全的脱节。2)另一个错误的假设是,选择XML很棒,并且大多数选择Java的人肯定是程序员。XML不是灵丹妙药,但是对于某些事情来说是好的。
Eyal Solnik '16

2
@EyalSolnik:有些人在遇到问题时会认为“我知道,我将使用XML。”<Problem:Worsening> <Problem:TimeDescription>Now</Problem:TimeDescription> <Problem:Posessive>they have</Problem:Posessive> <Problem:Quantity>many, many</Problem:Quantity> <Problem:WorseningDescription>more problems</Problem:WorseningDescription> </ProblemWorsening>
Mason Wheeler

3
仅仅因为人们滥用某种东西并不意味着技术本身就是不好的,您就可以在许多地方看到相同的综合症。
艾尔·索尔尼克

8

我通常会听到“ blo肿”和“慢速”这两个词。

它不是最紧凑的语法,但显然是最富表现力的一种。可读吗?取决于您如何设计语言。大多数人没有为XML设计语言,他们只是将对象序列化为XML。

…为什么有那么多人使用它?

无处不在。您可以使用XQuery查询XML数据库,使用XSLT转换为XHTML或Atom,从其他Web服务获取Atom或其他XML格式,使用XForms从用户获取XML,使用XMLSchema,Relax NG或Schematron对其进行验证,然后使用XProc,使用XQuery Update将其保存回数据库。所有这些工具都了解XML,因此无需在不同表示形式之间进行映射。

XML不是序列化技术,它是一种通用信息集。


...并且我们问了自己多年,为什么在chrissakes中,SOAP是建立在XML之上的。
JensG 2014年

6

在这里,我们将其用于不同供应商制造的具有不同内部表示形式的不同系统之间的数据交换。我们建立了一个XML转换/交换系统来来回传送数据。为此很好。

XML并不是天生就坏,但是我承认使用XML设计“好的”解决方案并非易事。


5

“ XML的本质是这样的:它解决的问题并不难,而且不能很好地解决问题。” -Phil Wadler,2003年POPL

我个人的观点是,只要您不关心验证,模式,XSLT和其他丑陋的东西,并且将文件的大小保持在很小的范围内(否则解析就变慢了),您可以找到XML的一些良好用法(例如用于配置您的应用程序,而不使用INI文件)。


4

以我的经验,人们大多抱怨它的使用方式,而不是技术本身。

人们抱怨的and肿且缓慢的位通常是用于从中获取信息的库/方法。

我用它来存储少量结构化信息,这些信息要存储在磁盘上(没有数据库或二进制序列化),或者传递给另一个应用程序(本质上也描述SOAP)。


2

其优点是:

它是多个异构系统可以用来与之通信的标准“接口”。并且是“人类”可读的(有点,请尝试凝视5 MB XML)

不好的原因是:

其肿,更大的大小=更多的带宽=更多的$$

还有其他原因,每个人都有不同的感受...


4
@Darknight:我通过向您抛出Xml实体来挑战人类可读性……(个人怒气)
Matthieu M.

1
我不认为XML本质上是ated肿的-但是它的实现是。我发现XML-RPC在不必要的膨胀方面尤其令人震惊。
HorusKol 2011年

3
@HorusKol:<advanceAcceptanceIndicator>Y</advanceAcceptanceIndicator>比率数据/标记太低了……我称此为“膨胀”。例如,JSon只会would肿一半:advanceAcceptanceIndicator: "Y"。还存在一个事实,即标记之间的文本是有效的,因此在阅读Xml时,您需要决定如何处理此cruft \n\t\t\t,并且解决方案通常是忽略它,因为您一开始并不真正对此感兴趣。
Matthieu M.

1
@HorusKol:可以,但是我从未说过这是一个布尔值,它恰好是单个char :)在这里使用属性(value?)可能也会更好,因为人们可能会想在两个之间插入空格标签。
Matthieu M.

1
“它肿了,更大的体积=更多的带宽=更多的$$”我猜压缩还没有被发明出来。
安迪

2

像其他任何技术一样:有许多可用的工具和库。

我不喜欢XML,特别是因为它很时髦,当人们说它是人类可读的时,我认为他们是在开玩笑,或者当人们试图将xml嵌入属性时他们从未真正阅读过xml ... xml实体使其真正成为了现实。无法读取。此外,令人惊讶的是,由于冗余的末端标签以及混合自由文本和数据的能力,浪费了多少空间。

但:

  • 可以指定Xml(xsd),并且可以使用工具检查Xml数据的一致性
  • 许多工具(文本编辑器等)都支持Xml
  • 许多库(关于每种编程语言)都支持Xml

在大多数情况下,它也具有优先级的优势。当您已经在Xml中提供了Web服务,并且要求提供一项新服务时...可能会在Xml中完成,因为这就是您所知道的。


5
XML比二进制或位置或逗号分隔的数据更具可读性。
FrustratedWithFormsDesigner

仅针对天真的用户。如果我必须目视扫描几百条记录以查找丢失一些数据的记录,我宁愿在固定长度的记录块中查找一些空白列,也不用遍历一大堆元素和属性来查找空标签。
TMN

1
@FrustratedWithFormsDesigner:它实际上取决于手头的数据。Xml在信息本身附近嵌入信息的性质。如果您看一下函数式编程语言,您会看到(Haskell):之类的内容data Person = Person { surname :: String, firstName :: String, age :: Int },如果我也看到Person "Doe" "John" 42它也是可读的,并且避免了很多麻烦,但它更接近逗号分隔。
Matthieu M.

1
好的,您的示例在没有标记的情况下更易于阅读,但是可以制作一些琐碎的示例(我想说少于8或9个数据元素)来支持所有形式(也许是二进制)。来自大型机的数据馈送是由位置定界的字符串产生的(大多数只是数字代码),在转换为XML之后,它们易于阅读,调试和管理。如您所说,这可能取决于...
FrustratedWithFormsDesigner

@FrustratedWithFormsDesigner:是的,这正是我的观点:)这取决于,但是由于存在如此丰富的XML生态系统,并且因为仅维护一组工具/库更容易,所以人们通常将XML用于所有内容。就个人而言,我更喜欢JSon而不是XML,但再次使用了缩进:p
Matthieu M.

-1

对于必须由人类维护的文件,XML是一个糟糕的选择。标记和内容之间没有视觉上的分隔,使其难以阅读。在没有专用编辑器的情况下正确编写非常繁琐。XML文档中的任何错误都是致命的。XML文档不能被部分处理。当XML文件无效时,产生的错误消息通常无济于事。

对于必须由人类维护的任何文件,我更喜欢使用JSON,YAML或某种解释语言(Python,Ruby,Groovy等)的源代码中的任何一种。我们发现,为遗留代码创建XML配置的一种好方法是使用Groovy MarkupBuilder。另一个不错的选择是创建特定领域的语言。使用Ruby,Groovy和许多其他语言很容易做到这一点。


8
我认为您缺少XML的要点,标记就是内容。XML的目的是描述数据的含义。例如,如果您有电话号码,则将其标记为座机号码或手机号码会添加其他人可能使用的上下文。或为此在文字周围添加电话标签(可能使该号码可在手机上拨打)。至于您的其他观点,我也不同意。编写xml文档通常非常简单。错误消息始终与格式正确有关,我将随时通过JSON手工编辑xml
Homde 2011年

@konrad您的电话示例适用于HTML。
Florian F

“ XML文档中的任何错误都是致命的;不能部分处理XML文档。” 是的,这与XML相当。
安迪

@Andy如果XML是由人类编写的,而应用程序只是说“错了!”,那将毫无用处。人工编辑人员需要知道检测到错误的行。
凯文·克莱恩

任何数量的工具都会告诉您确切的行以及通常在哪个字符上检测到错误。例如,NotePad ++中的XML工具。.Net也会准确告诉您.config文件在哪里。如果您在谈论API,那么XML的好处之一就是API开发人员还可以提供XSD,这不仅可以确保有效的XML语法还可以告诉您是否存在不属于您的元素,是否应该只能是该元素之一,等等。手写json更容易搞砸。
安迪

-2

解析相对容易,同时又易于阅读。

并且一些不错的解析器(例如Xerces {c ++})也很容易获得。


2
好吧,只要文件很小,就很容易。如果您不得不分析太大而无法合理容纳到内存中的文档,那么事情就会变得严峻。
TMN

我会质疑人类的可读性。与读取等效的JSON相比,读取XML花费了太多精力。
cmaster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.