Xsi: schemaLocation 的用途是什么?

我看到我们有多个 url 作为这个属性的值,就像在 Spring 中一样:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

为什么需要它,它是用来做什么的? Spring 是否进入 url 并进行验证? Xmlns 和 xsi: schemaLocation 之间的区别是什么?

144395 次浏览

xmlns是文档中的一个唯一标识符——它不一定是模式的 URI:

XML 名称空间通过将元素和属性名与 URI 引用标识的名称空间关联,为限定 XML 文档中使用的元素和属性名提供了一种简单的方法。

xsi:schemaLocation 应该给出关于模式实际位置的提示:

可以在文档中使用,以提供关于可用于评估的模式文档的物理位置的提示。

Spring 使用的 JavaXML 解析器将读取 schemaLocation值并尝试从因特网上加载它们,以验证 XML 文件。接下来,Spring 拦截这些加载请求,并从它自己的 JAR 文件中提供版本。

如果省略 schemaLocation,那么 XML 解析器将不知道从哪里获取模式以验证配置。

根据 模式定位规范

可能存在一个可以通过名称空间名称检索的模式,也可能没有... ... 用户社区和/或消费者/提供者协议可能会建立这样的情况: [试图从名称空间 url 检索 xsd ]是一种明智的默认策略

(谢谢你的明确,规格!)

还有

如果文档作者(人或非人)创建了一个具有特定模式的文档,并保证部分或全部文档符合该模式,则提供 schemaLocation 和 noNamespaceSchemaLocation [属性]。

因此,基本上只指定一个名称空间,您的 XML“可能”会在该位置根据 xsd 进行验证(即使它缺少 schemaLocation属性) ,这取决于您的“社区”如果您指定了一个特定的 schemaLocation,那么它基本上意味着 xml 文档“应该”符合所说的 xsd,因此“请验证它”(正如我读到的)。我的猜测是,如果你不做一个 schemaLocationnoNamespaceSchemaLocation属性它只是“没有验证”的大部分时间(根据其他答案,似乎 java 这样做)。

这里的另一个问题是,通常在 java 库中使用 xsd 验证[例如: spring config XML 文件] ,如果你的 XML 文件在 XML 文件中指定了一个特定的 schemaLocation xsd URL,比如 xsi:schemaLocation="http://somewhere http://somewhere/something.xsd",通常在你的一个依赖 jar 中,它会在它的资源部分 包容一个 xsd 文件的副本,Spring 有一个“映射”功能,它说把 xsd 文件看作是映射到 url http://somewhere/something.xsd(所以你永远不会去 web 下载文件,它只是存在于本地)。更多信息请参见 https://stackoverflow.com/a/41225329/32453

如果您进入这些位置中的任何一个,那么您将找到在这些模式中定义的内容。例如,它告诉您 ini-method 关键字值的数据类型是什么。