为什么有这么多项目使用XML来配置文件?
答案 0 :(得分:39)
这是一个重要的问题。
大多数替代方案(JSON,YAML,INI文件)更容易解析而不是XML。
此外,在像Python这样的语言中 - 一切都是源代码 - 将配置简单地放在一个标记清晰的Python模块中会更容易。
然而,有些人会说XML比JSON或Python有一些优势。
XML的重要之处在于,在编写特定于应用程序的配置文件时,XML语法的“普遍性”并没有真正应用。由于配置文件的可移植性无关紧要,因此一些Python人员用Python编写配置文件。
修改强>
配置文件的安全性无关紧要。 “在Python中配置Python程序是一个安全风险”的论点似乎忽略了Python已经安装并作为源运行的事实。当您拥有源代码时,为什么要在配置文件中处理复杂的hack?只是破解来源。
我听说有人说“有人”可以通过配置文件破解你的应用程序。谁是这个“某人”?系统管理员? DBA?开发者?没有很多神秘的“某人”可以访问配置文件。
任何可能出于恶意目的而破解Python配置文件的人都可能安装键盘记录程序,假证书或其他更严重的威胁。
答案 1 :(得分:31)
作为旁注,我并不是想保护XML。它有它的用途,每当我回到它时,我将在一个项目中使用它。但在许多情况下,尤其是配置文件,它的唯一优势是它是一种标准化的格式,我认为这远远超过了许多缺点(即它太冗长)。但是,我个人的偏好并不重要 - 我只是在回答为什么有些人会选择使用XML作为配置文件格式。我个人永远不会。
答案 2 :(得分:24)
因为XML听起来很酷而且很有企业性。
编辑:我没有意识到我的答案是如此模糊,直到评论者要求 enterprisey 的定义。 Citing Wikipedia:
[...]术语“企业”旨在超越“小型组织过度使用”的关注,暗示软件过于复杂,即使对于大型组织而言,也可以使用更简单,经过验证的解决方案。
我的观点是XML是一个流行语,因此被过度使用。尽管有其他意见,XML也不容易解析(只看libxml2,它的gzip源包当前超过3MB)。由于冗余量,手动写入也很烦人。例如,Wikipedia lists XML configuration是jabberd
受欢迎程度降低的原因之一,有利于其他实施。
答案 3 :(得分:13)
XML是一个很好的开发和采用标准,比专有配置格式更容易阅读和理解。
此外,值得了解的是,XML序列化是大多数语言中常用的工具,这使得开发人员可以非常轻松地保存对象数据。当其他人已经为您完成工作时,为什么要建立自己的方法来保存复杂数据的层次结构?
.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
爪哇: http://java.sun.com/developer/technicalArticles/Programming/serialization/
答案 4 :(得分:9)
感谢您的回答。 这个问题虽然乍一看似乎很幼稚但并不那么天真:)
就我个人而言,我不喜欢配置文件的XML,我认为人们很难阅读和更改,而且计算机难以解析,因为它非常通用且功能强大。
INI文件或Java propery文件仅适用于需要嵌套的最基本应用程序。 将嵌套添加到这些格式的常见解决方案如下:
level1.key1=value
level1.key2=value
level2.key1=value
不是很好看,很多冗余,很难在节点之间移动。
JSON并不是一种糟糕的语言,但它的设计很容易被计算机解析(它是有效的JavaScript),所以它并没有被广泛用于配置文件。
JSON看起来像这样:
{"menu": {
"id": "file",
"value": "File",
"popup": {
"menuitem": [
{"value": "New", "onclick": "CreateNewDoc()"},
{"value": "Open", "onclick": "OpenDoc()"},
{"value": "Close", "onclick": "CloseDoc()"}
]
}
}}
在我看来,它太混乱了逗号和引号。
YAML适用于配置文件,以下是示例:
invoice: 34843
date : 2001-01-23
bill-to: &id001
given : Chris
family : Dumars
但是,我不太喜欢它的语法,我认为使用空格来定义范围会使事情变得有点脆弱(想想将块粘贴到不同的嵌套级别)。
几天前,我开始为配置文件编写自己的语言,我将其命名为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支持上面的简单形式或引号中的字符串 - 它允许字符串中的空格甚至换行符。 我很快就会添加数组,比如:
name [1 2 b c "Delta force"]
有一个Java实现,但欢迎更多实现。 :)。 检查网站以获取更多信息(我已经涵盖了大部分内容,但Java API提供了一些有趣的功能,如选择器)
答案 5 :(得分:8)
另外一点,如果您有一个XSD(模式文件)来描述您的配置文件,那么您的应用程序验证配置文件是微不足道的。
答案 6 :(得分:3)
因为解析XML相对容易,并且如果明确指定了模式,任何实用程序都可以轻松地读取和写入信息。
答案 7 :(得分:2)
嗯..,XML是一种通用规范,可以包含描述,嵌套信息和有关某些内容的数据。并且有许多API和软件可以解析它并阅读它。
因此,以正式方式描述已知的跨平台和应用程序非常容易。
答案 8 :(得分:1)
以下是一些历史原因:
答案 9 :(得分:0)
因为XML允许您基本上创建自己的语义标记,这可以由几乎任何语言构建的解析器读取。另一个好处是,用XML编写的配置文件可以用于您使用两种或更多语言的项目。如果您要创建一个配置文件,其中所有内容都被定义为特定语言的变量,那么它显然只能使用该语言。
答案 10 :(得分:0)
XML的主要优点及其之所以如此受欢迎是因为它在java世界中很流行,因此用java编写的所有企业应用程序都使用它,也因为Web服务和soap都是基于xml的,所以使用它们在企业应用程序中有很多。
到目前为止,除了ajax应用程序之外,JSON和所有其他格式都没有得到业界的良好支持。此外,JSON没有模式语言或定义的解析api,如XML。
即使粗略地说,JSON不需要xml所拥有的大量内容,至少不是以同样的方式,而且我在网络服务中说话时,我说...
答案 11 :(得分:0)
其他答案中未指定的一个原因是Unicode /文本编码/您为其命名。文件中需要中文字符串吗?没问题。这可能听起来微不足道,但是当引入XML时却没有。显然不在INI文件中。
另一件事 - 这是第一件让我们有可能使用列表,词典或任何你想要的结构化数据,这是可机器处理和人类同时编辑的。
它有缺点,但你还能用什么呢? Yaml看起来很棒,但我害怕在我工作的项目中介绍它,因为我只是在想象中看到人们在错误的地方放置一个空白区域的所有问题,或者合并不关心它们的工具。