用于configuration文件的XML,为什么?

为什么这么多项目使用XML来configuration文件?

这是一个重要的问题。

大多数select(JSON,YAML,INI文件)比XML 更容易parsing。

另外,在像Python这样的语言中,所有东西都是源代码的,简单的把你的configuration放在一个明确标记的Python模块中。

然而,有些人会说XML比JSON或Python有一些优势。

XML的重要之处在于,在编写特定于应用程序的configuration文件时,XML语法的“普遍性”并不真正适用。 由于configuration文件的可移植性不重要,一些Python人员用Python编写他们的configuration文件。


编辑

configuration文件的安全性并不重要。 “用PythonconfigurationPython程序是一个安全风险”的论点似乎忽视了Python已经安装并作为源代码运行的事实。 为什么要在源文件中处理configuration文件中的复杂黑客? 只是破解来源。

我听过人们说“有人”可以通过configuration文件破解你的应用程序。 谁是这个“人”? 系统pipe理员? DBA? 开发者? 没有很多神秘的“人”可以访问configuration文件。

任何能够为了恶意目的而破解Pythonconfiguration文件的人都可能会安装键盘logging器,假证书或其他更严重的威胁。

  1. XML很容易parsing。 在大多数语言中有几种stream行的,轻量级的,function丰富的和/或免费的XMLparsing库。
  2. XML很容易阅读。 这是一种非常容易理解的标记语言,所以人们可以很容易地写和写电脑。
  3. XML是很好的规定。 每个人和他的狗都知道如何编写体面的XML,所以对语法没有任何困惑。
  4. XML很受欢迎。 在这个过程中,一些重要人物开始推动XML是“未来”的想法,许多人都购买了它。
  5. XML是一种双向格式。 这是空白,评论和秩序保存。 您可以以编程方式加载,更改,然后保存它,同时保留格式。 这对于用户可以用来configuration应用程序的工具很重要。 这是XML最初起步的原因之一(世界变得越来越技术化,所以这不是一个需要)。
  6. XML具有可选的模式validation。 工具和复杂configuration格式非常重要。
  7. XML具有名称空间。 这允许embedded其他configuration或注释而不影响parsing。 在其他configuration格式中,这通常是通过黑客特殊注释或属性名称来完成的。

作为一个方面说明,我不是要捍卫XML。 它有它的用处,每当我回到那个时候,我都会在一个项目中使用它。 在许多情况下,特别是configuration文件,唯一的好处是它是一个标准化的格式,我认为这远远超过了许多缺点(即它太冗长了)。 然而,我的个人喜好并不重要 – 我只是在回答为什么有些人会select使用XML作为configuration文件格式。 我个人从来不会。

因为XML听起来很酷且有企业性。

编辑:我没有意识到我的回答是如此含糊,直到一位评论者要求企业的定义。 引用维基百科 :

“企业”一词意在超越“小型组织的矫枉过正”的问题,即使对于大型组织来说也意味着软件过于复杂,并且可以使用更简单,经过validation的解决scheme。

我的观点是,XML是一个stream行词,因此被滥用。 尽pipe有其他观点,但XML并不容易parsing(只要看一看libxml2,它的gzip源代码包目前已经超过了3MB)。 由于冗余的数量,也很烦人的手写。 例如, 维基百科列出了XMLconfiguration ,这是使jabberd受欢迎程度降低的原因之一。

XML是一个很好的开发和采用的标准,比专有configuration格式更容易阅读和理解。

此外,值得了解的是,XML序列化是大多数语言中的常用工具,使开发人员可以非常轻松地保存对象数据。 为什么当别人已经为你完成工作时,build立自己的方法来保存复杂数据的层次结构?

.NET: http : //msdn.microsoft.com/en-us/library/system.xml.serialization.aspx

PHP: http : //us.php.net/serialize

Python: http : //docs.python.org/library/pickle.html

Java: http : //java.sun.com/developer/technicalArticles/Programming/serialization/

感谢您的回答。 这个问题,因为它可能看起来乍看起来并不那么幼稚:)

就个人而言,我不喜欢configuration文件的XML,我认为人们很难阅读和改变,而且电脑很难parsing,因为它是非常通用和强大的。

INI文件或Java propery文件只适用于需要嵌套的最基本的应用程序。 将嵌套添加到这些格式的常见解决scheme如下所示:

 level1.key1=value level1.key2=value level2.key1=value 

不是一个美丽的景象,很多的冗余,很难在节点之间移动的东西。

JSON并不是一个糟糕的语言,但是它被devise得很容易被计算机parsing(这是有效的JavaScript),所以它不被广泛地用于configuration文件。

JSON看起来像这样:

 {"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }} 

在我看来,它太杂乱的逗号和引号。

YAML适合configuration文件,下面是一个示例:

 invoice: 34843 date : 2001-01-23 bill-to: &id001 given : Chris family : Dumars 

然而,我不太喜欢它的语法,我认为使用空格来定义范围会使事情变得有点脆弱(想想把一个块粘贴到不同的嵌套层次上)。

前几天我开始写configuration文件我自己的语言,我把它命名为Swush 。

这里有几个例子:作为一个简单的键值对:

 key:value key:value2 key1:value3 

或者作为一个更复杂和评论

 server{ connector{ protocol : http // HTTP or BlahTP port : 8080 # server port host : localhost /* server host name*/ } log{ output{ file : /var/log/server.log format : %t%s } } } 

Swush支持上面简单forms的string,或者用引号引起来 – 它允许string中的空白字符和换行符。 我打算快速添加数组,比如:

 name [1 2 bc "Delta force"] 

有一个Java实现,但更多的实现是受欢迎的。 :)。 检查网站的更多信息(我涵盖了大部分,但Java API提供了一些有趣的function,如select器)

还有一点,如果你有一个XSD(模式文件)来描述你的configuration文件,你的应用程序validationconfiguration文件是微不足道的。

因为parsingXML相对容易,而且如果您的架构是明确指定的,任何实用程序都可以轻松读取和写入信息。

那么,XML是一个通用的规范,可以保存描述,嵌套的信息和关于某事的数据。 有许多API和软件可以parsing和阅读。

所以用正式的方式来描述一些被称为跨平台和应用程序的东西是很容易的。

这是一些历史原因:

  • W3C从Perl构build工具转移到了Java
  • Apache基础从构buildPerl工具转移到Java
  • Java有很多XML API
  • 因此可以用Java完成configuration
  • 通过XML和属性文件进行configuration适用于非Java开发人员

JTidyconfigurationvs tidyconfiguration是一个很好的例子。

因为XML允许您基本上创build您自己的语义标记,可以通过几乎任何语言构build的parsing器读取它。 另外一个好处是,用XML编写的configuration文件可以用在使用两种或多种语言的项目上。 如果您要创build一个configuration文件,其中所有内容都被定义为某种特定语言的variables,那么显然只能使用该语言。

XML的主要优点以及之所以如此受欢迎是因为它在java世界中很stream行,因此用java编写的所有企业应用程序都使用它,并且因为Web服务和soap基于xml,并且在企业应用。

到目前为止,JSON和其他所有格式都得不到业界的支持,除了在Ajax应用程序。 另外,JSON没有像XML这样的模式语言或定义的parsingAPI。

即使粗略地说,JSON并不需要XML的东西吨,至less不是相同的方式,我说的Web服务,当我说…

在其他答案中没有指定的一个原因是Unicode /文本编码/你的名字。 在文件中需要中文string? 没问题。 这可能听起来微不足道,但是当XML被引入时,它不是。 显然不在INI文件中。

另一件事 – 这是第一件让我们有可能使用列表,字典或任何你想要的结构化数据的可能性,这是机器可处理的,同时是可编辑的。

它有缺点,但你还能用什么? Yaml看起来不错,但是我害怕把它介绍到我所做的项目中,因为我只是在想象中看到所有那些把人的空间放在错误的地方或合并工具而不关心它们的问题。