xsi:schemaLocation有什么用?

我发现我们在spring中有多个url作为这个属性的值:

<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和validation? xmlns和xsi:schemaLocation有什么区别?

spring使用的Java XML分析器将读取schemaLocation值并尝试从互联网加载它们,以validationXML文件。 Spring反过来拦截这些加载请求,并从它自己的JAR文件中提供版本。

如果您省略schemaLocation ,那么XMLparsing器将不知道从何处获取模式以validationconfiguration。

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

XML名称空间通过将可扩展标记语言文档中使用的元素和属性名称与URI引用标识的名称空间关联起来,提供了一种简单的方法。

xsi:schemaLocation应该提供一个关于实际模式位置的提示:

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

根据Schemas定位规范

可能有也可能没有可通过命名空间名称检索的模式…用户社区和/或消费者/提供者协议可以build立[试图从命名空间url检索xsd]是合理的默认策略

(感谢你毫不含糊,spec!)

如果文档作者(不论是否为人)在视图中创build了具有特定模式的文档,并且保证文档的一部分或全部符合该模式,则提供schemaLocation和noNamespaceSchemaLocation [属性]。

所以基本上只要指定一个名称空间,根据您的“社区”,您的XML“可能”将被尝试针对该位置的xsd进行validation(即使它缺lessschemaLocation属性)。 如果你指定一个特定的schemaLocation ,那么它基本上是暗示xml文档“应该”符合所说的xsd,所以“请validation它”(当我读它)。 我的猜测是,如果你不做一个schemaLocationnoNamespaceSchemaLocation属性,它只是“大多数时候没有被validation”(根据其他答案,看来java是这样做的)。

另一个问题是,如果XML文件在XML文件中指定了特定的schemaLocation xsd url,比如xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"通常在你的一个依赖jar中,它将在其资源部分包含该xsd文件的一个副本,而spring有一个”映射“function,表示将xsd文件视为映射到url http://somewhere/something.xsd (所以你永远不会去networking和下载文件,它只是存在本地)。 有关更多信息,另请参阅https://stackoverflow.com/a/41225329/32453

如果你进入这些地点,那么你会发现在这些模式中定义了什么。 例如,它告诉你什么是ini-method关键字值的数据types。