【问题标题】:Disgusting XML configuration with no schema - why?没有架构的令人作呕的 XML 配置 - 为什么?
【发布时间】:2010-07-20 22:55:09
【问题描述】:

这不是关于为什么将 XML 用于配置文件的问题。我的问题是为什么,当 XML 用于配置文件时,没有随附的架构

log4net 就是一个很好的例子。您可以通过编程方式对其进行配置,但最好使用 XML。很好,但是为什么要这么难呢?

在 Visual Studio 中,当我使用模式键入 XML 时,我会得到很好的 Intellisense。没有一个,我不得不猜测每个元素和属性,因为似乎从来没有一个全面的列表。 XML 变成了令人作呕的 XML,一种容易出错且输入乏味的类型。

你们中从事过此类项目的人:为什么发布它们时附带文档和 XML cmets 和示例,但没有 XML 模式来简化配置?是懒惰吗?背后有真正的动机吗?没人想到吗?

【问题讨论】:

  • 如果你真的在使用 VS 为什么不使用msdn.microsoft.com/en-us/library/cc442691.aspx
  • 因为我不知道架构中可能的所有内容;我只知道我精心编辑的 XML 配置文件中发生了什么。
  • (另外,在我将 XML 用于只读数据或配置数据的项目中,我确实包含了一个模式。它没有详尽地指定有效的每个字段的值,但它确实明确了元素和属性的去向。)

标签: xml open-source configuration xsd log4net


【解决方案1】:

我相信,虽然大多数开发人员都非常了解 XML,并且有了这些知识,他们可以构建读取 XML 配置文件的程序,但对 XML 模式的理解却并不那么好。

由于大多数用于编写 XML 模式的工具要么要花很多钱,要么可以免费获得,但使用起来不太好或不好用,这可能会使情况变得更糟。然后,认真试验 XML 模式就变得有点困难了。

(我知道,当然,文本编辑器应该足以同时编写 XML 和 XSD。但是,恕我直言,专业工具是否可用通常会产生至关重要的影响。)

【讨论】:

  • 但是在 Visual Studio 中,自动生成架构很容易,并且根据需要进行改进也相当容易。如果您正在编写开源库,那么您可以使用所有范围的配置选项,因此您知道架构应该允许什么。
  • @Kyralessa:但是你也可以在有效的 XSD 中表达你的配置选项吗? (我做不到。)虽然 Visual Studio 能够(部分)从 XML 文档推断 XSD,但它不一定能正确处理,因此您仍然必须了解 XSD 才能修复或完成输出。
  • 当然,我不一定要为给定元素或属性指定每个有效值(或有效值范围)。但我至少可以说出哪些元素和属性属于哪里。为什么人们会认为模式不应该存在,除非它绝对完美?当您必须手动键入 XML 配置时,仅显示元素和属性所在位置的 .xsd 可以节省大量时间(因为自动完成)。
【解决方案2】:

我认为主要原因是,在大多数情况下,您已经在评估 xml 的代码中对文档中的期望提出了期望。因此,模式可以被视为额外的工作。甚至在开源工作中也不是免费的……;D

【讨论】:

    【解决方案3】:

    不,我不打算使用 XSchema,因为该标准笨重、不灵活,并且除了基本的类型化句法验证之外不提供任何东西。

    所以它允许我为文件定义语法,为值定义基本数据类型,但我仍然必须为任何重要的参数编写自己的验证例程。即便如此,无法定义我自己的词法形式,或定义我自己的限制或超出基本范围约束的基本 xsd 数据类型的扩展,使得规范无法表达我需要的句法形式,即使对于句法验证也是如此。

    想想你如何声明一个元素的 text() 应该是一个有效的 ISBN?还是有效的文件名/目录路径?还是素数?还是闰年? ETC? ETC?等等?

    如果你幸运的话,我个人可能会为你提供一个 DTD(即一个奇怪格式的无类型 EBNF)。我什至可以在它上面运行一个自动 DTD 到 RelaxNG 转换器并为你清理结果。但不要指望我写一个模式。如果我想提供真正的验证支持,那么无论如何您都不会获得 XSchema;相反,我将把 GRDDL+OWL 交给你,在 XSLT 和声明性 FOL 约束语言的强大功能之间,我实际上可以声明值得做的验证。

    【讨论】:

    • 你正在从一个极端走向另一个极端。我不是在寻找可以验证我放入的每个值的架构。我正在寻找可以与 Visual Studio 的智能感知(在 .xml 文件中)一起使用的东西,让我了解哪些元素和属性有效。当然,我可能仍然需要参考文档,但至少有一个模式可以减少输入数据的痛苦,因为它不需要我输入所有内容。对于像 NHibernate 这样的配置繁重的东西,我不明白为什么不这样做。
    猜你喜欢
    • 2020-06-03
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2016-05-01
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多