为啥 URL 在 XML 命名空间中?

Posted

技术标签:

【中文标题】为啥 URL 在 XML 命名空间中?【英文标题】:Why are URLs in XML namespaces?为什么 URL 在 XML 命名空间中? 【发布时间】:2011-08-11 02:40:17 【问题描述】:

以这一行为例:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
</configuration>

一些简短的研究告诉我,没有必要在该 URL 上托管任何内容。因此,如果它只是对包含在本地程序集中的命名空间的引用,为什么要使用 URL 而不是像 .NET 通常使用的常规命名空间(例如 System.Data)?

【问题讨论】:

可能是因为它们非常独特。 我知道 URL 是为了唯一性。为什么我们需要唯一的 XML 标签? 【参考方案1】:

这只是一个约定。 URI(它们就是这样,而不是真正的 URL)是一种方便且全球熟悉的识别资源的方式。另一方面,.NET 样式的标识符对于 .NET 开发人员来说是熟悉和可识别的 - XML 比 .NET 更多。

【讨论】:

@Robert:我不同意。 XML 命名空间 URI 只需在使用它们的上下文中是唯一的。理想情况下,除此之外,是的,但仅适用于公共架构。 @oscilatingcretin:命名空间是一个任意标识符。你可以在里面放任何你想要的东西(“Grabblesnackers”),但是使用 URI 是按照惯例完成的,大概是因为如果你控制了域,它就保证是唯一的。 @oscilatingcretin: Schemas.Microsoft.XmlDocumentTransform 仍然是一个 URI,并且和其他任何东西一样有效。然而,更广泛的约定是使用 URL 样式的 URI——它只是一个约定 好的。删除了最后一条评论,所以我向仍在回复它的任何人道歉。所以基本上都是随意的。有人说:“即使超文本传输​​协议甚至不是等式的一部分,我们也会在我们的 URI 上加上 http 前缀。不一定有任何押韵或理由,但我这里有大假发而且“所以我们将继续在它前面加上 http。为什么是 http 而不是 ftp?嗯,因为我说过了。”这就是我对事情的看法。谢谢大家的讨论。 这是一篇很好的文章,为什么 XML 命名空间是 URI,以及为什么它是错误的:xml.com/pub/a/2005/04/13/namespace-uris.html【参考方案2】:

W3 explanation Here

就像 .NET 中的命名空间一样,XML 文档中的命名空间旨在帮助防止和解决名称冲突,尤其是当 XML 文档来自不同的组织和/或知识领域时。

XML 文档格式已由负责 HTML 的同一个人进行了样式化,因此您可能会在该格式的元素中发现句法上的相似之处。从语义上讲,dotNET 和 XML 命名空间服务于相同的目标。

【讨论】:

我了解 URI 和 XML 文档格式的概念。我最初的帖子解决了为什么 XML 名称空间看起来像 URL 的问题。是的,我知道 URL 是 URI,但是 URL 有一些可以明显识别的东西。它有一个协议、一个域、一个后缀、文件夹引用,而且大多数时候还有一个文档。我很清楚 XML 命名空间格式之所以如此简单,是因为最初的 XML ganstas 基于他们对当时事物如何工作的理解做出了决定。如果今天发明了 XML,它的命名空间很可能不会像 URL。 另外,这里有几个人说 URL 样式的命名空间具有唯一性,但我不明白如何。任何 URI 格式都没有唯一性保证,无论是 XML 还是 .NET 样式的命名空间(除非您谈论的是 URL)。在我看来,将“http”和“.com”放入命名空间没有任何逻辑支持。如果有人未能续订域名注册而其他人购买了它(咳咳微软)怎么办?他们的 URL 样式的 URI 现在有什么用?没有一致性,imo。 @oscilatingcretin:GUID 也不能保证是唯一的,但是正确生成的 GUID 与另一个 GUID 相同的可能性非常小。使用 URL 可以合理地保证唯一性。 合理的方式是什么?还没有人解决我的问题,即为什么 URL 样式的命名空间有意义。 HTTP(超文本传输​​协议)与它有什么关系?为什么不是 FTP?有人告诉我为什么 http://schemas.microsoft.com/XML-Document-Transform 比 Microsoft.Schemas.XmlDocumentTransform 更有意义。我知道我很久以前就选择了一个答案,但我只想进一步讨论这个话题 我知道这是旧的,但没有人回答@oscilatingcretin。假设是 microsoft.com 归微软所有,因此在某种意义上是“可控的”。无论如何都不是完美的,但微软并且只有微软可以将架构发布到 microsoft.com/xyz。除非他们忘记更新域名等... :)【参考方案3】:

当您问为什么标准是这样时,您的问题有两种可能的解释:(a) 做出的设计选择的感知好处是什么,以及 (b) 的历史顺序是什么导致该设计被其他设计采用的事件。

显然,使用类似 HTTP 的 URI 具有唯一性。但这也可以通过其他方式实现,例如通过发明一个新的 URI 方案。我认为,如果您追溯当时提出的论点,您会发现许多主张使用 HTTP 样式 URI 的人也主张命名空间 URI 应该是可取消引用的,可能是模式或其他类型的文件。事实上,它自己的命名空间的 W3C 政策是,当您在浏览器中键入命名空间 URI 时,总有一个可以检索到的文档,并且它应该告诉您有关命名空间的一些有用信息。

因此,我怀疑我们使用的 URI 看起来可以引用,但没有为取消引用时发生的情况定义任何语义,这实际上是委员会在两个或多个对立阵营之间妥协的结果。但是你必须做一些适当的历史研究来证实这一点。

【讨论】:

这个解释对我来说听起来完全合理(聪明的人,对 XML 几乎一无所知 - 现在只是学习)。但是,如果在课程、教程等中解释了这些内容,那就更有意义了。我看到很多命名空间没有使用作者的私有 URI,而是都指向 w3c 站点(s)相反 - 因为人们盲目地复制他们在某处看到的示例,如果他们不了解他们在做什么以及为什么。所以唯一性消失了。 恐怕在不理解的情况下复制示例是这些天酷孩子编程的方式,你可以编写世界上所有的书籍和教程,但它无济于事。【参考方案4】:

问题的核心是命名空间必须是 URI。这种事情没有充分的理由,因为它只需要一个唯一标识符来为定义的元素提供上下文。

由于它们必须是 URI,所有可能性都是毫无意义的,因为需要一个方案(例如 http),即使命名空间与此类事情无关。

所以要回答为什么的问题:就像所有坏主意一样,当时有人认为这是个好主意。

【讨论】:

以上是关于为啥 URL 在 XML 命名空间中?的主要内容,如果未能解决你的问题,请参考以下文章

JAXB:为啥在生成的 xml 文档中未使用定义的命名空间前缀?

XML名命空间

为啥 XNode 在 System.XML.Linq 命名空间而不是 System.XML?

为啥命名空间限定节点没有 XPath 语法?

Vue的bind为啥在WebStorm中会报命名空间的错误

为啥`XmlDocument.LoadXml()`不适用于命名空间?